filter
根据 规则 对数据进行 筛选过滤,符合规则的数据保留,不符合规则的数据丢弃。
例子 - Predicate接口对象
List<String> list = new ArrayList<>();
Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四");
list.stream()
.filter(new Predicate<String>(){
@Override
public boolean test(String item) {
return item.startsWith("李");
}
}) // 过滤姓李的数据
.forEach(item -> System.out.println(item));
例子 - lambda表达式
List<String> list = new ArrayList<>();
Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四");
list.stream()
.filter(item -> item.startsWith("李")) // 过滤姓李的数据
.forEach(item -> System.out.println(item));
例子 - 多个条件
List<String> list = new ArrayList<>();
Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四");
list.stream()
.filter(item -> item.startsWith("李")) // 过滤姓李的数据
.filter(item -> item.length() == 2) // 过滤姓名是2个字的
.forEach(item -> System.out.println(item));
map
将 集合 中的 每个元素 传入 函数 后,生成一个新元素,并将 新元素 组成一个 集合,并返回该集合
注意:map处理前后的元素数量是相同的
例子
将流中的每个数据乘2
List<Integer> list = new ArrayList<>();
Collections.addAll(list,10,15,2,4,8);
list.stream()
.map(item -> item * 2) // 将流中的每个数据乘2
.forEach(item -> System.out.println(item));
flatMap
如果流中的数据是 数组 或 集合,可以指定规则,将其展平
简单例子
Integer[] arr2 = {1,2};
Integer[] arr3 = {3,4};
Integer[][] arr = {arr2,arr3};
Arrays.stream(arr)
.flatMap( item -> Arrays.stream(item))
.forEach(item -> System.out.println(item));
复杂例子
List<String> list = new ArrayList<>();
Collections.addAll(list,"李雷 lili","韩梅梅 lucy");
list.stream()
.flatMap( item -> Arrays.stream( item.split(" ") ))
.forEach(item -> System.out.println(item));
reduce()
reduce() 函数会对集合中元素进行聚合:
- 将集合中的 第 1、2 个元素传给 lambda表达式,计算后得出结果
- 再将该结果与第3个元素 传给 lambda表达式,计算后得出结果
- 以此类推,最后得到结果
例子
求集合元素累加和
List<Integer> list = new ArrayList<>();
Collections.addAll(list,1,2,3,4);
Optional<Integer> res = list.stream()
.reduce((i1, i2) -> i1 + i2);
System.out.println(res.get());