5.1 筛选
在本节中,我们来看看如何选择流中的元素:用谓词筛选,筛选出各不相同的元素。
5.1.1 用谓词筛选
Stream接口支持filter方法(你现在应该很熟悉了)。该操作会接受一个谓词(一个返回boolean的函数)作为参数,并返回一个包括所有符合谓词的元素的流。例如,你可以像图5-1所示的这样,筛选出所有素菜,创建一张素食菜单。
List<Dish> vegetarianMenu = menu.stream().filter(Dish::isVegetarian) ←---- 方法引用检查菜肴是否适合素食者.collect(toList());

图 5-1 用谓词筛选一个流
5.1.2 筛选各异的元素
流还支持一个叫作distinct的方法,它会返回一个元素各异(根据流所生成元素的hashCode和equals方法实现)的流。例如,以下代码会筛选出列表中所有的偶数,并确保没有重复(使用equals方法进行比较 )。图5-2直观地显示了这个过程。
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-2 筛选流中各异的元素
在测验5.1上试试本节学过的内容吧。
测验5.1:筛选
你将如何利用流来筛选前两个荤菜呢?
答案:可以把
filter和limit组合在一起来解决这个问题,并用collect(toList())将流转换成一个列表。
List<Dish> dishes =menu.stream().filter(dish -> dish.getType() == Dish.Type.MEAT).limit(2).collect(toList());
