我有以下代码,它使用Stream API来查找卡路里超过300的集合中的前3个元素的名称:
List<Dish> dishes = ....
List<String> unhealthyDishes = dishes.stream()
.filter(dish -> dish.getCalories() > 300)
.map(dish -> dish.getName())
.limit(3)
.collect(Collectors.toList());
在传统的基于迭代器的命令式方法中,我可以保留结果的计数,因此一旦我得到所需数量的元素,就可以退出迭代循环。但是上面的代码似乎贯穿了集合的整个长度。我如何停止这样做,并在得到我需要的3个元素后停止?
你怎么知道它也检查其他元素?我刚刚设置了这个小测试:
String[] words = {"a", "a", "a", "aa"};
List<Integer> shortWords = Arrays.stream(words)
.filter(word -> {
System.out.println("checking " + word);
return word.length() == 1;
})
.map(String::length)
.limit(3)
.collect(Collectors.toList());
System.out.println(shortWords);
输出结果是:
checking a
checking a
checking a
[1, 1, 1]