写点什么

JAVA 基础 -- java8 新特性一之 lambda 表达式

发布于: 2020 年 12 月 16 日

你可以不知道怎么编写带有lambda表达式的代码,但是你必须能看明白它到底是什么东西,因为目前流行后端框架中都有它的身影。

如果需要使用到lambda表达式,那么必须要了解函数式接口。

      什么是函数式(Functional)接口:一个接口有且仅有一个抽象方法,那么,这个接口,我们把它叫做函数式接口。



举例:

    (o1,o2) -> Integer.compare(o1,o2);

       

       左边( (o1,o2) ):lambda形参列表  (其实就是接口中的抽象方法的形参列表)。

       右边( Integer.compare(o1,o2); ):lambda体  (其实就是重写抽象方法的方法体)。



Lambda使用(六种情况):

//第一种 无参数,无返回值
@Test
public void lambda01() {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("新建一个初始化线程");
}
};
r1.run();

System.out.println("*********************************");

//使用lambda表达式之后
Runnable r2 = () -> System.out.println("新建一个初始化线程");
r2.run();
}



//第二种 有参数,无返回值
@Test
public void lambda02() {
Consumer c1 = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println("使用消费者" + integer);
}
};
c1.accept(1);

System.out.println("*********************************");

//使用lambda表达式之后
Consumer<Integer> c2 = (Integer integer) -> System.out.println("使用消费者" + integer);
c2.accept(2);
}



//第三种 数据类型可以省略,因为可以有编译器推断得出,称为”类型推断“
@Test
public void lambda03() {
Consumer<Integer> c1 = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println("使用消费者" + integer);
}
};
c1.accept(1);

System.out.println("*********************************");

//使用lambda表达式之后
Consumer<Integer> c2 = (integer) -> System.out.println("使用消费者" + integer);
c2.accept(2);
}



//第四种情况 如果参数只要一个的情况下,可以省略参数列表的小括号
@Test
public void lambda04() {
Consumer<Integer> c1 = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println("使用消费者" + integer);
}
};
c1.accept(1);

System.out.println("*********************************");

//使用lambda表达式之后
Consumer<Integer> c2 = integer -> System.out.println("使用消费者" + integer);
c2.accept(2);
}



//第五种情况 需要两个或者以上参数,多条执行语句,并且有返回值
@Test
public void lambda05() {
Comparator<Integer> c1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
System.out.println(c1.compare(11,22));

System.out.println("*********************************");

//使用lambda表达式之后
Comparator<Integer> c2 = (o1, o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(c2.compare(11,22));
}



//第六种情况 当lambda体只有一条语句是,return和方法体的大括号都可以省略
@Test
public void lambda06() {
Comparator<Integer> c1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
};
System.out.println(c1.compare(11,22));

System.out.println("*********************************");

//使用lambda表达式之后
Comparator<Integer> c2 = (o1, o2) -> o1.compareTo(o2);
System.out.println(c2.compare(11,22));
}



总结:

      --> 左边: lambda形参列表的参数类型都可以省略(类型推断);如果lambda形参列表只有一个,()可以省略。

      --> 右边:lambda体应该使用{}包裹,如果lambda方法体如果只有一条语句,可以省略return和大括号(注意:要省略必须同时省略。)



发布于: 2020 年 12 月 16 日阅读数: 10
用户头像

还未添加个人签名 2020.01.16 加入

还未添加个人简介

评论

发布
暂无评论
JAVA基础 -- java8新特性一之 lambda表达式