本章内容
- 筛选、切片和匹配
- 查找、匹配和归约
- 使用数值范围等数值流
- 从多个源创建流
- 无限流
5.1筛选和切片
5.1.1 用谓词筛选
Stream接口支持 filter 方法。该操作会接受一个谓词(一个返回 boolean 的函数)作为参数,并返回一个包括所有符合谓词的元素的流。
List<Dish> vegetarianMenu = menu.stream()
// 方法引用检查菜肴是否适合素食者
.filter(Dish::isVegetaian)
.collect(toList());
5.1.2筛选各异的元素
流还支持一个叫作 distinct 的方法,它会返回一个元素各异(根据流所生成元素的 hashCode 和 equals 方法实现)的流。例如,一下代码会筛选出列表中所有的偶数,并确保没有重复。
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream()
.filter(i -> i % 2 == 0)
.distinct()
.forEach(System.out::println);
5.1.3 截短流
流支持 limit(n) 方法,该方法会返回一个不超过给定长度的流。所需的长度作为参数传递给 limit 。如果流是有序的,则最多会返回前 n 个元素。比如,你可以建立一个 List,选出热量超过 300 卡路里的头三道菜:
List<Dish> dishes = menu.stream()
.filter(d -> d.getCalories() > 300)
.limit(3)
.collect(toList());
请注意 limit 也可以用在无序流上,比如源是一个 Set。这种情况下,limit 的结果不会以任何顺序排序。