lambda表达式
1.1 格式
(参数列表)->{代码}
1.2 省略规则
- 参数类型可以省略
- 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
- 方法只有一个参数时小括号可以省略
2 Stream流
-
Stream流使用的是函数式编程模式
-
可以操纵数组和集合
2.1 常用操作
2.1.1 创建流
-
单列集合:集合对象.stream()
authors.stream()
-
数组:Arrays.stream(数组)或者使用Stream.of来创建
Integer[] arr = {1,2,3,4,5,6,7,8,8,7}; Stream<Integer> stream = Arrays.stream(arr); Stream<Integer> stream = Stream.of(arr);
-
双列集合:换成单列集合后在创建
Map<String,Integer> map = new HashMap<>(); map.put("a",1); Stream<Map.Entry<String,Integer>> stream = map.entrySet().stream();
2.2 中间操作
filter
对流元素进行过滤
List<Author> authors = getAuthors();
authors.stream().filter(i -> i.getName().length() > 2).forEach(System.out::println);
map
可以对流中的元素进行计算或者转换
List<Author> authors = getAuthors();
authors.stream().map(author->author.getName()).forEach(name->System.out.println(name));
distinct
可以去除流当中的重复元素
Integer[] arr = {1,2,3,4,5,6,7,8,8,7};
Arrays.stream(arr).distinct().forEach(System.out::println);
**注意:**distinct方法是依赖Object的equals方法来判断是否是相同对象的。所以要注意重写equals方法
sorted
对流中的元素排序
List<Author> authors = getAuthors();
authors.stream().sorted((o1, o2) -> o1.getAge() - o2.getAge()).forEach(System.out::println);
**注意:**如果调用空参的sorted()方法,需要对流中的元素实现Comparable接口
limit
可以设置流的最大长度,超出的部分将被抛弃
List<Author> authors = getAuthors();
authors.stream().distinct().limit(2)
.forEach(author -> System.out.println(author.getName()));
skip
跳过流中的前n个元素,返回剩下的元素
flatMap
map只能把一个对象转换成另一个对象来作为流中的元素,而flatMap可以把一个对象编程多个对象作为流中的元素
List<Author> authors = getAuthors();
authors.stream().flatMap(new Function<Author, Stream<Book>>() {
@Override
public Stream<Book> apply(Author author) {
return author.getBooks().stream();
}
}).forEach(new Consumer<Book>() {
@Override
public void accept(Book book) {
System.out.println(book.getName());
}
});
2.3 终结操作
forEach
对流中的元素进行遍历操作,我们通过传入的参数去指定对遍历到的元素进行什么具体的操作
count
用来获取当前流中元素的个数
max&min
用来获取流中的最值
collect
把当前流转换成一个集合
查找和匹配
anyMatch
可以用来判断是否有任意符合匹配条件的元素,结果为boolean类型
allMatch
可以用来判断是否都符合匹配条件,结果为boolean类型,如果都符合结果为true,否则结果为false
noneMatch
可以判断流中的元素是否都不符合匹配条件,如果都不符合为true
findAny
获取流中的任意一个元素,该方法没有办法保证获取的一定是流中的第一个元素
findFirst
获取流中的第一个元素
reduce归并
对流中的数据按照你指定的计算方式计算出一个结果(缩减操作)
reduce的作用是吧stream中的元素给组合起来,我们可以传入一个初始值,它会按照我们的计算方式依次拿流中的元素和在初始化值的基础上进行计算,计算结果在和后面的元素计算
2.4 注意事项
-
惰性求值
如果没有终结操作,中间操作是不会得到执行的
-
L流是一次性的
一旦一个流对象经过一个终结操作后,这个流就不能再被使用
-
不会影响原数据
我们在流中可以多数据做很多处理,但是正常情况下是不会影响原来集合中的元素