我最近開始玩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 –