相信现在大家使用的java版本都是1.8及以上的了吧,对于所说的java8新特性感觉真的不能说新了,毕竟现在java16版本都发布了;
因为在项目中遇到好多代码都是能使用少写的坚决不多谢一个字母,lambda表达式、stream…在项目中全都是这些写法,有必要花点时间巩固一下,不至于看到这些写法都感觉看不懂的样子;
Lambda表达式它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理;
最简单的Lambda表达式可由参数列表、->符号和语句块组成:
for(Object o: list) {
System.out.println(o);
}
可以写成:
//->后可以写任何表达式,计算 list.forEach( e -> System.out.println( e ) );
-
Lambda表达式主要用于替换以前广泛使用的内部匿名类,各种回调;例如Thread类的Runnable;
不需要显式地把它转成一个Runnable,因为Java能根据上下文自动推断出来:一个Thread的构造函数接受一个Runnable参数,而传入的λ表达式正好符合其run()函数,所以Java编译器推断它为Runnable
Thread oldSchool = new Thread( new Runnable () {
@Override
public void run() {
System.out.println("common method... ");
}
} );
等价于:
Thread gaoDuanDaQiShangDangCi = new Thread( () -> {
System.out.println("lambda method...");
} );
Stream
Java8集合类引入了另一个重要概念:流;一个流通常以一个集合类实例为其数据源,然后在其上定义各种操作。流的API设计使用了管道模式。对流的一次操作会返回另一个流。
Stream类似一个迭代器,在流的过程中,对流中的元素执行一些操作,比如”过滤掉长度大于10的字符串“、“获取每个字符串的首字母”等。
要想操作流,首先要有一个数据源,可以是数组或者集合。每次操作都会返回一个新的流对象,方便进行链式操作,但原有的流对象会保持不变。
流的操作可以分为两种类型:
- 中间操作,可以有多个,每次返回一个新的流,可进行链式操作。
- 终端操作,只能有一个,每次执行完,这个流也就用光光了,无法执行下一个操作,因此只能放在最后。
中间操作不会立即执行,只有等到终端操作的时候,流才开始真正地遍历,用于映射、过滤等。通俗点说,就是一次遍历执行多个操作,性能就大大提高了。
1. 创建流- 如果是数组,使用Arrays.stream() 或者 Stream.of() 创建流;
- 如果是集合,使用 stream() 方法创建流;
- 过滤
通过 filter() 方法可以从流中筛选出想要的元素;
filter() 方法接收的是一个 Predicate(Java 8 新增的一个函数式接口,接受一个输入参数返回一个布尔值结果)类型的参数
Stream
stream = list.stream().filter(e -> e.contains("java")); forEach() 方法接收的是一个 Consumer(Java 8 新增的一个函数式接口,接受一个输入参数并且无返回的操作)类型的参数
stream.forEach(System.out::println);
- 映射
使用 map() 方法,把一个流中的元素转化成新的流中的元素;
map() 方法接收的是一个 Function(Java 8 新增的一个函数式接口,接受一个输入参数 T,返回一个结果 R)类型的参数,此时参数 为 String 类的 length 方法,也就是把 Stream 的流转成一个 Stream 的流。
Stream
stream = list.stream().map(String::length);
-
collect()方法满足将流转回集合或者数组;
通过 stream() 方法创建集合的流后,再通过 map(String:length) 将其映射为字符串长度的一个新流,最后通过 collect() 方法将其转换成新的集合。
List
list = list.stream().map(String::length).collect(Collectors.toList()); String name = list.stream().map(e -> e.getName()).collect(Collectors.joining(","));Collectors 是一个收集器的工具类,内置了一系列收集器实现,比如说 toList() 方法将元素收集到一个新的 java.util.List 中;比如说 toCollection() 方法将元素收集到一个新的 java.util.ArrayList 中;比如说 joining() 方法将元素收集到一个可以用分隔符指定的字符串中。
这篇文章主要写自己在刚工作中经常遇到的一些特性;当然新特性不只这些。完整的文章推荐大家可以看一下:
https://blog.csdn.net/lixiaobuaa/article/details/81099838
https://blog.csdn.net/qing_gee/article/details/105238960
下一篇文章:文件的上传和下载



