快速了解Lambda表达式-Java

lambda表达式

前言

最近因为疫情,也不能正常返校什么的,希望大家都能好好的,希望武汉加油,中国加油,在家也看了很多视频,学了一点新的东西,虽然懒惰,但是也要努力啊。今天记录分享Lambda表达式的知识。

Lambda表达式是JDK8新增的特性 下面的图就是JDK8的新特性,JDK5和JDK8相对来说都是比较重要有的Java版本。

所以学习使用其中的新特性也是比较重要的。

简介

Lambda表达式指的是应用在单一抽象方法接口环境下的一种简化定义形式,可以用来解决匿名内部类的定义复杂问题。
今天这篇讲的是lambda表达式,它是一种新的语法规则。它是一种匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。它可以写出更简洁、更灵活的代码。作为一种更紧凑简洁的代码风格,使 Java 语言的表达能力得到了提升。

简单入门

interface Message {
    public void print();
}

public class TestDemo {
    public static void main(String[] args){
        //lambda表达式,这里是覆写接口中的print方法
        fun() -> System.out.println("hello world");
       //原来的写法
       // fun(new Message(){
       //   @Override
       // public void print)() {
       //   System.out.println("hello world");
       //}
       //});
    }
public static void print(Message msg){
    msg.print();
 }
}

用法

  • Lambda的基本语法如下

(参数) -> 方法体/lambda体
解析:
  	左边是成员列表/形参列表(有时就是接口中的抽象方法的方法引用)
	右边的方法体是要重写的抽象方法的方法体
	-> 是操作符,也叫做lambda箭头操作符
	
	
  • 简单示例

// 1. 不需要参数,返回值为   
() -> 1  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)
  • 具体使用方法/写法-一共可以分为六种情况去写。

/**
 * @Author: yhy
 * @Time: 22:37
 * 用来测试使用lambda语句
 */
public class LambdaDemo {
//    -> lambda操作符

    //    情况一:无参且无返回值
    @Test
    public void test1() {
//        原来的写法
        Runnable r0 = new Runnable() {
            @Override
            public void run() {
                System.out.println("abc");
            }
        };

//        lambda写法
        Runnable r = () -> System.out.println("abc");
        r.run();
    }

    //情况二 需要一个参数,但没有返回值
//    原始写法
    Consumer<String> con = new Consumer<>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }

    };

    //    lambda写法
    Consumer<String> con2 = (String s) -> {
        System.out.println(s);
    };

    //情况三:数据类型省略,可推断出类,又叫做类型推断 前面已经知道是string类型了
//    所以这里直接省略了后面的括号的string类型说明
//    和泛型的格式很像,可以省略后面的类型说明
    Consumer<String> con3 = (s) -> {
        System.out.println(s);
    };

    //    情况四:一个参数的时候, 括号可以不写 下面的s就是一个参数
    @Test
    public void test2() {
        Consumer<String> con4 = s -> {
            System.out.println(s);
        };
        con4.accept("abcdefg");
    }

    // 情况五:需要两个或者以上的参数,且方法中多条执行语句,并且有返回值
    @Test
    public void test3() {
//        原来的写法
        Comparator<Integer> com = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(02);
            }
        };
        System.out.println(com.compare(13,15));
//        lambda表达式
        System.out.println("------------------");
        Comparator<Integer> com2 =(o1,o2) -> {
            return o1.compareTo(02);
        };
        System.out.println(com2.compare(14,12));
    }
//    情况六:当lambda只有一条语句时候,可以在lambda体中省略括号和return
    @Test
    public void test4(){
//        原来的写法
    Comparator<Integer> com1 = (o1,o2) -> {return o1;};
    }
//    lambda规则六表达式写法
    Comparator <Integer> com2 = (o1, o2) -> o1;
}

好处

能够简洁,快速写代码,看的出代码量差别,但是有一说一,有时不会很好懂,但是看得懂还是最基本的要求。

总结

表达式的左边:Lambda形参列表的参数类型可以省略,如果只有一个参数的时候,也可以省略括号

表达式的右边:Lambda体,一对{}包裹着,只有一条执行语句的时候,也可以省略大括号,若有返回值,省略的时候也可以省略return

最后,以前用匿名内部类的地方都可以使用Lambda表达式类代替.

这一篇文字没写多少,因为我觉得学的太慢了,不能浪费太多时间在做博客上,所以以记录分享为主,菜鸟一枚,加油,共勉!

posted @ 2020-02-15 23:12  coderyhy  阅读(446)  评论(0编辑  收藏  举报