我最近开始玩Java 8,在Haskell/Scala之前完成了一些小部分。我正在尝试使用Java中的高阶函数,例如map
或forEach
,我正在努力去理解将所有东西推向意识形态的动机。我理解它给好的,一般的抽象,它被认为是懒惰的,但是让我们考虑一个非常简单的,常见的例子:Java 8 - 流思想
list.map(x -> do_sth(x));
很常见的成语,期待这个返回一个List<T>
。现在,在Java 8,我需要做这样的某物:
list.stream().map(x -> doSth(x)).collect(Collectors.toList())
现在,就我看到这一点,流将不适用的地图,直到收集被调用,所以会有一次通过集合在引擎盖下。我看不到的是为什么这些常见的地图用例,如map.toList()
,list.groupBy()
等列表不会被添加到相应的接口?我在这里错过了一个潜在的设计决定吗?
什么我不明白,也许你可以解释 - 为什么这,.collect(Collectors.toList()),当它可以有一个toList()方法内置?它对我来说似乎冗长而笨拙。 –
如果你有'toList',你可能会想'toSet'和'toMap'。但是你仍然需要'collect'方法,因为它非常灵活。所以现在一些收集操作会有自己专用的便利方法,而对于其他收集操作你需要调用'collect'。也许这种便利性值得不妥之处和不一致,但设计师认为不是。 –
我看到很多代码被迫写入:stream()... collect(Collectors。toList()),而不是stream()... toList(),因为jdk设计器的一些愚蠢的想法。那真令人恶心。 “toList”,“toSet”,“toMap”是最常用的终止操作。他们应该被添加到Stream API –