Java8新特性之lambda表达式
Java8的lambda表达式也不是什么新鲜事儿了,毕竟java9都出来了那么久 了,也不是想说怎么用。只是想记录一下自己的学习的一个过程。加深一下自己,做个记录而已。
列子1
- 在以前如果我们开启一个线程的做法有两种,集成Thread类覆写其中run函数;实现Runnable接口覆写run函数。现在我们以实现Runnable接口为例。
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello world");
}
}).start();
在这里面其实我们只关心一个地方,那就是在run函数中的代码,但是我们不得不去一些其他额外的事来满足这样的语法。有了lambda以后我们有了更简洁的代码了;
new Thread(()->System.out.println("hello world")).start();
之前我们想要将行为传入函数,仅有的选择就是匿名内部类。有了lambda表达式以后,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
列子2
匿名内部类的方式
TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
return Integer.compare(str1.length(), str2.length());
}
});
Lambda 方式
TreeSet<String> set2 = new TreeSet<String>((str1,str2)->Integer.compare(str1.length(), str2.length()));
新的操作符
“->”: Lambda 操作符或剪头操作符。它将 Lambda 分为 两个部分:
- 左侧:指定了 Lambda 表达式需要的所有参数
- 右侧:指定了 Lambda 体,Lambda表达式要执行的功能。
语法格式
- 无参,无返回值,Lambda 体只需一条语句
Runnable r1 = () -> System.out.println("hello world");
- Lambda 需要一个参数
Consumer<String> con = (args) -> System.out.println(args);
- Lambda 只需要一个参数时,参数的小括号可以省略
Consumer<String> con = args -> System.out.println(args);
- Lambda 需要两个参数,并且有返回值
BinaryOperator<Long> bo = (x,y) ->{
System.out.println("hello world");
return x+y;
};
- 当Lambda 体只有一条语句时,return 与大括号可以省略
BinaryOperator<Long> bo = (x,y) ->x+y;
- 数据类型是可以省略的,加上也没毛病。
BinaryOperator<Long> bo = (Long x,Long y) ->{
System.out.println("hello world");
return x+y;
};