提问者:小点点

如何在所需数量的结果后退出Java流处理?


我有以下代码,它使用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个元素后停止?


共1个答案

匿名用户

你怎么知道它也检查其他元素?我刚刚设置了这个小测试:

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]