筛选元素filter

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

List vegetarianMenu = menu.stream()
.filter(Dish::isVegetarian) //方法引用检查菜肴是否适合素食者
.collect(toList());

image.png

removeIf 和 filter 区别

filter是Java8 Stream的方法:
返回由与此给定谓词匹配的此流的元素组成的流。
removeIf是Java8 Collecttion的一个默认方法。
删除满足给定谓词的这个集合的所有元素。
removeIf和filter方法都能达到过滤/删除元素的作用。
从功能是实现上,removeIf是条件为true则过滤此元素,false则保留。而filter则是条件为false过滤此元素,而true则保留。
从时间上,要看场景,因为removeIf返回的是boolean,而filter是个intermediate operation,需要terminal operation最终来处理流,如果只是单单只做删除/过滤操作, removeIf会快些。

示例:

  1. public static void main(String[] args) {
  2. List list = new ArrayList(Arrays.asList(1,2,3,4,5));
  3. long last = System.currentTimeMillis();
  4. list.removeIf(a -> a.equals(2));
  5. System.out.println(System.currentTimeMillis() - last);//37~38
  6. }
  1. public static void main(String[] args) {
  2. List list = new ArrayList(Arrays.asList(1,2,3,4,5));
  3. long last = System.currentTimeMillis();
  4. list.stream().filter(a -> !a.equals(2)).collect(Collectors.toList());
  5. System.out.println(System.currentTimeMillis() - last);//41~44
  6. }

原文: https://blog.csdn.net/Butterfly_resting/article/details/100045181

截短流limit

流支持limit(n)方法,该方法会返回一个不超过给定长度的流。所需的长度作为参数传递给limit。如果流是有序的,则最多会返回前n个元素。比如,你可以建立一个List,选出热量超过300卡路里的头三道菜:

List dishes = menu.stream()
.filter(d -> d.getCalories() > 300)
.limit(3)
.collect(toList());

你可以看到,该方法只选出了符合谓词的头三个元素,然后就立即返回了结果。
请注意limit也可以用在无序流上,比如源是一个Set。这种情况下,limit的结果不会以任何顺序排列。
image.png

去重元素distinct

流还支持一个叫作distinct的方法,它会返回一个元素各异(根据流所生成元素的hashCode和equals方法实现)的流。例如,以下代码会筛选出列表中所有的偶数,并确保没有重复。

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

image.png

跳过元素skip

流还支持skip(n)方法,返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一个空流。请注意,limit(n)和skip(n)是互补的!例如,下面的代码将跳过超过300卡路里的头两道菜,并返回剩下的

List dishes = menu.stream()
.filter(d -> d.getCalories() > 300)
.skip(2)
.collect(toList());
image.png