【发布时间】:2016-01-08 09:32:30
【问题描述】:
有了java 8,现在我们可以使用java.util.Collection.stream来做一些收集基本功能,例如filter、map、collect、anyMatch等。
问题是当你有一个 Collection 并且你必须使用其中的一些函数时,代码会变得有点难看,例如:
List<String> ids = this.getFriends(userId).stream().map(Friend::getFriendUserId).collect(Collectors.toList())
在这种情况下,我有一个List<Friend>,我希望有一个List<String> 填充第一个列表中每个项目的friendId。
我认为代码可能是这样的:
List<String> ids = this.getFriends(userId).map(Friend::getFriendUserId);
这当然更易读也更干净,但由于List 不理解消息映射而无效。我不明白在 Java 8 中实现这个会有什么问题,为什么他们决定每次都强制转换为Stream,而在某些情况下,我们又将它转换回Collection,就像在这种情况下一样.
【问题讨论】:
-
主要原因是在流行的接口上添加(默认)方法很危险,因为它可能会破坏一些子类型。很可能有人有一个 List 的子类型,有自己的
map方法;如果在 java 8 中添加了List.map,它将不会在 java 8 下编译。 -
这就是为什么他们在向 Collections API 添加方法时非常保守。仍然有关于破损的投诉。
-
@bayou.io 好吧,这很好,我认为你应该把它写成一个。
标签: java list collections java-8 java-stream