【JavaCore】lambda表达式3

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

在本系列中,你会了解如何使用lambda表达式采用一种简洁的语法定义代码块,以及如何编写处理lambda表达式的代码。

构造器引用

构造器引用与方法引用类似,方法名为new。例如,Person::new是Person构造器的一个引用。至于调用哪一个构造器,这个取决于上下文。

假设我们有一个字符串列表,可以把它转换成一个Person对象数组。

List<String> names = ...;
Stream<Person> stream = names.stream().map(Person::new);
List<Person> people = stream.collect(Collectors.toList());
复制代码

如果有多个Person构造器,编译器会选择一个String参数的构造器,因为它从上下文中推导出这是在调用带一个字符串的构造器。

我们还可以使用数组类型来建立构造器引用。例如,int[]::new是一个数组类型的构造器引用,它有一个参数,即为数组的长度。这个等价于lambda表达式x -> new int[x]。
Java有一个限制,无法构造泛型类型T的数组。我们可以使用数组构造器引用来克服这个限制。
表达式new T[n]会产生错误,因为这会改为new Object[n]。

例如,如果我们需要一个Student对象数组。Stream有一个toArrray方法可以返回Object数组:

Object[] students = stream.toArray();
复制代码

但是我们想要的是Student类型的数组,而非Object类型。
我们可以使用构造器引用来解决这个问题,以下为例。

Student[] students = stream.toArray(Student[]::new);
复制代码

这样的话,toArray方法调用这个构造器引用得到了一个有正确类型的数组。

  • 每天一个Java小知识

同步和异步的区别?同步的实现方法?
同步:发送一个请求,等待返回,然后再发送下一个请求。实现:1. Synchronized修饰;2.wait和notify。
异步:发送一个请求,不等待返回,随时可以再发送下一个请求。

同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。

同步和异步最大的区别就在于,一个需要等待,一个不需要等待。

比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息。

电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息。

感谢观看,这是Java lambda表达式系列的第一篇文章,如果您有兴趣,可以关注一下我,方便查看后续文章,一起学习,共同进步,不胜感激!