首页 > 解决方案 > stream() 方法是懒惰的吗?如果是惰性的,那么这个方法本身是否可以像返回流一样被视为中间方法?

问题描述

List<Item> applePhones = list.stream()
            .filter((item) -> item.getCompany().equalsIgnoreCase("Apple"))
            .filter((item) -> item.getDevice().equalsIgnoreCase("Phone"))
            .collect(Collectors.toList());

这里这些过滤器操作是中间的,collect 是终端,那么流调用是什么?

标签: javafunctional-programmingjava-stream

解决方案


简短的回答是stream()您使用它,它不是一种Stream方法(它是Collection.stream)。这意味着流方法/操作的中间与终端惰性与急切的区别是无关紧要的。

List.stream在这种情况下代表流的来源。filter拥有一个流对象,然后您可以在其上调用中间和/或终端操作(collect在您的示例中)。这是一种避免哲学化的简单方法。

我理解它的方式(可能过于简单化了):

  • streamObject.operation()-> Stream:中间/惰性流操作(stream.filter(),stream.map()等)
  • streamObject.operation()-> 其他或无效:终端流操作(stream.collect(),stream.count()等)
  • somethingElse.stream()-> Stream:源(我不认为是这个流工厂/创建者概念的“名称”,尽管据我所见,这是java.util.stream包文档list.stream()所指的) - ( , Arrays.stream(), Stream.of(), optional.stream(),reader.lines()等.)

推荐阅读