5.1 筛选

在本节中,我们来看看如何选择流中的元素:用谓词筛选,筛选出各不相同的元素。

5.1.1 用谓词筛选

Stream接口支持filter方法(你现在应该很熟悉了)。该操作会接受一个谓词(一个返回boolean的函数)作为参数,并返回一个包括所有符合谓词的元素的流。例如,你可以像图5-1所示的这样,筛选出所有素菜,创建一张素食菜单。

  1. List<Dish> vegetarianMenu = menu.stream()
  2. .filter(Dish::isVegetarian) ←---- 方法引用检查菜肴是否适合素食者
  3. .collect(toList());

5.1 筛选 - 图1

图 5-1 用谓词筛选一个流

5.1.2 筛选各异的元素

流还支持一个叫作distinct的方法,它会返回一个元素各异(根据流所生成元素的hashCodeequals方法实现)的流。例如,以下代码会筛选出列表中所有的偶数,并确保没有重复(使用equals方法进行比较 )。图5-2直观地显示了这个过程。

  1. List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
  2. numbers.stream()
  3. .filter(i -> i % 2 == 0)
  4. .distinct()
  5. .forEach(System.out::println);

5.1 筛选 - 图2

图 5-2 筛选流中各异的元素

在测验5.1上试试本节学过的内容吧。

测验5.1:筛选

你将如何利用流来筛选前两个荤菜呢?

答案:可以把filterlimit组合在一起来解决这个问题,并用collect(toList())将流转换成一个列表。

  1. List<Dish> dishes =
  2. menu.stream()
  3. .filter(dish -> dish.getType() == Dish.Type.MEAT)
  4. .limit(2)
  5. .collect(toList());