ch3.ng

Java8新特性之lambda表达式


Java8的lambda表达式也不是什么新鲜事儿了,毕竟java9都出来了那么久 了,也不是想说怎么用。只是想记录一下自己的学习的一个过程。加深一下自己,做个记录而已。

列子1

  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 分为 两个部分:

语法格式

  1. 无参,无返回值,Lambda 体只需一条语句
Runnable r1 = () -> System.out.println("hello world");
  1. Lambda 需要一个参数
Consumer<String> con = (args) -> System.out.println(args);
  1. Lambda 只需要一个参数时,参数的小括号可以省略
Consumer<String> con = args -> System.out.println(args);
  1. Lambda 需要两个参数,并且有返回值
BinaryOperator<Long> bo = (x,y) ->{
	System.out.println("hello world");
	return x+y;
};
  1. 当Lambda 体只有一条语句时,return 与大括号可以省略
BinaryOperator<Long> bo = (x,y) ->x+y;
  1. 数据类型是可以省略的,加上也没毛病。
BinaryOperator<Long> bo = (Long x,Long y) ->{
	System.out.println("hello world");
	return x+y;
};