1、为什么使用lambda表达式

Lambda是一个匿名函数,可以理解为一段可以传递的代码,将代码像数据一样进行传递,可以写出更加简介、更加灵活的代码。作为一宗更紧凑的代码风格,使Java的语言表达能力得到了提升

2、Lambda表达式的基础语法

java8中引入了一个新的操作符 “->”,该操作符称为箭头操作符或者Lambda操作符

箭头操作符将Lambda表达式拆分成两部分:

  • 左侧:Lambda的参数列表
  • 右侧:Lambda表达式中所需执行的功能,即Lambda体

1) 语法格式1

无参,并且无返回值

() -> System.out.println("hello lambda")

@Test
public void test1(){
    int num = 0; // jdk7以前必须是final

    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println("hello,Lambda!!!" + num);
        }
    };
    r.run();

    Runnable r1 = () -> System.out.println("hello lambda!!!");
    r1.run();
}

2) 语法格式2

有一个参数,并且无返回值

Runnable r1 = (arg) -> System.out.println(arg);
r1.run();

3) 语法格式3

若左侧只有一个参数,那么左边的 ()可以不写

@Test
public void test2(){
Consumer con = (x) -> System.out.println(x);
con.accept(“后臣特别特别帅@-@”);

Consumer<String> con1 = x -> System.out.println(x);
con1.accept("后臣特别特别帅@-@");

}

4) 语法格式4

有两个以上的参数,有返回值,并且Lambda 体中有多条语句

Comparator comparator = (x,y) -> {
System.out.println(“函数式接口”);
return Integer.compare(x,y);
};

5)语法格式5

如果lambda中只有一条语句,那么可以省略{} + return

@Test
public void test3(){
Comparator comparator = (x,y) -> {
System.out.println(“函数式接口”);
return Integer.compare(x,y);
};

System.out.println("--------------------------------------");
Comparator<Integer> comparator1 = (x,y) ->  Integer.compare(x,y); 

}

6) 语法格式6

Lambda表达式的参数列表的的数据类型可以省略不写,因为JVM编译期可以通过上下文推断出数据

类型,即“类型推断” …

Comparator<Integer> comparator1 = 
(Integer x,Integer y) ->  Integer.compare(x,y);

3、Lambda 表达式需要”函数式接口"的支持

见下:


4、lambda练习

/**
 * @author houChen
 * @date 2020/12/25 21:37
 * @Description: Lambda表达式 例子
 */
public class TestLambda3 {
    List<Employee> employees = Arrays.asList(
            new Employee("张三",18,3000),
            new Employee("李四",45,4000),
            new Employee("王五",37,3000),
            new Employee("赵六",18,6000));


   // 先按照年龄排序,年龄相同按照name比较
    @Test
    public void test(){
        Collections.sort(employees,(e1,e2) -> {
            if(e1.getAge()==e2.getAge()){
                return e1.getName().compareTo(e2.getName());
            }else{
                return Integer.compare(e1.getAge(),e2.getAge());
            }
        });

        for(Employee e:employees){
            System.out.println(e);
        }
    }


    // 将字符串转大写
    @Test
    public void test1(){
        String upStr = StrHandler("hello,lambda", str -> str.toUpperCase());
        System.out.println(upStr);
    }

    //用于处理字符串
    public String StrHandler(String str,MyFunction mf){
        return mf.getValue(str);
    }
    

    // 计算两个Long型数据相加的he 
    @Test
    public void test2(){
        Long result = op(1l, 2l, (x, y) -> x + y);
        System.out.println(result);
    }

    public Long op(Long l1,Long l2,MyFunction2<Long,Long> mf){
        return mf.getValue(l1, l2);
    }
}
04-09 15:16