我從一個不受我控制的服務中獲得一個映射,該映射可能爲null,並且想要處理它,比方說,篩選,映射並減少到我需要的單個元素。使用基於內容的流<Map>
問:有沒有從「可選」到「流」的「鏈接」?
我試過(除其他事項外):
return Optional.ofNullable(getMap())
.map(Map::entrySet) // gets the entryset
.map(Stream::of)
.orElseGet(Stream::empty)
// i would then like to continue with
.filter(e -> e.getKey().startsWith("f")
.map(Entry::getValue)
.findFirst();
但後來我得到不Stream<Entry>
但Stream<Set<Entry>>
......有沒有辦法以某種方式flatMap集合或映射出一個可選的?
注意:我對流利的純流/可選方法感興趣。當然,當我將地圖保存到本地變量並確保它不爲空時它是有效的。
cast stream to Stream ?不,我不能。 –
你應該考慮改變你的getMap()來返回一個空映射而不是null。那麼你就不會把它包裝在'Optional'中,而且你很容易避免這樣的問題。正如[Stuart Marks](https://stackoverflow.com/users/1441122/stuart-marks)所說的那樣[Rule#4:爲了從中鏈接方法的特定目的而創建一個'Optional'通常是個不錯的主意以獲得價值。](https://youtu.be/Ej0sss6cq14?t=27m55s)。 –
在Java 9中,['Optional'將有'stream()'方法](http://download.java.net/java/jdk9/docs/api/java/util/Optional.html#stream--) ,你可以簡單地做:'Optional.ofNullable(getMap()).map(Map :: entrySet).stream()。flatMap(Set :: stream)...' –