为什么';t java.util.Collection是否实现新的流接口?

为什么';t java.util.Collection是否实现新的流接口?,java,lambda,functional-programming,java-8,java-stream,Java,Lambda,Functional Programming,Java 8,Java Stream,我只是花了一些时间开始研究关于streams和Lambda的java-8热潮。令我惊讶的是,您无法直接在java.util.Collection上应用流操作,如.map(),.filter()。java.util.Collection接口没有使用扩展有什么技术原因吗 这些流操作的默认实现 通过谷歌搜索,我看到很多人按照以下模式编码: List<String> list = someListExpression; List<String> anotherList = lis

我只是花了一些时间开始研究关于streams和Lambda的java-8热潮。令我惊讶的是,您无法直接在
java.util.Collection
上应用流操作,如
.map()
.filter()
java.util.Collection
接口没有使用扩展有什么技术原因吗 这些流操作的默认实现

通过谷歌搜索,我看到很多人按照以下模式编码:

List<String> list = someListExpression;
List<String> anotherList = list.stream().map(x -> f(x)).collect(Collectors.toList());

是的,做出这些决定有很好的理由:)

关键是急切操作和懒惰操作之间的区别。您在第一个问题下给出的示例显示了映射或筛选列表时生成新列表的操作。这没什么错,但这往往不是你想要的,因为你经常做的工作比你需要的多;急切操作必须对每个元素进行操作,并生成一个新集合。如果要编写多个操作(filter map reduce),则需要做大量额外的工作。另一方面,懒惰的操作组成得很漂亮;如果您这样做:

Optional<Person> tallestGuy = people.stream()
                                    .filter(p -> p.getGender() == MALE)
                                    .max(comparing(Person::getHeight));

但那只是逆流而上;最好只是实现一个高效的stream()方法。

谢谢Brian——非常好的澄清!!尽管如此——从实用的角度来看——对于所有日常运行的小型和简单的开发案例,在这些案例中,您既不关心惰性也不关心并行性,我认为在普通列表上应用(急切版本的“streams operations”)的更紧凑、普遍采用的方式/api将具有相当大的价值……是的,将来我们可能会考虑在清单上添加额外的名称。例如,我们在8中添加了
replaceAll
removeIf
,我们可能会添加更多。但是我们希望避开
中使用的名称,以避免混淆。如果在流操作结束时有选项对
.collect(Collections.toList())
方法进行编译器推断,这将非常有帮助。然而,如果可能的话,它需要非常仔细的实施。它甚至可能需要
=
操作符的语言支持,然后还需要提供不同重载的能力?恐怕Java的要求太高了?@BrianGoetz基本上是问
List newList=oldList.stream()
是可能的,因此省略
.collect(toList())
。也就是说,我会投票支持为普通收集器提供方便的方法:
Stream::toList
。但我发表评论的真正原因是感谢Brian回答了这些和其他设计问题!
Optional<Person> tallestGuy = people.stream()
                                    .filter(p -> p.getGender() == MALE)
                                    .max(comparing(Person::getHeight));
public<U> Stream<U> map(Function<T,U> mapper) { return convertToStream().map(mapper); }