使用Java 8在地图上流式传输
在本文中,我將向您展示如何在標準Java映射上有效地實現Speedment Open Source流,并將Stream接口擴展為MapStream! 即使在復雜的情況下,此添加將使保持流的具體性和可讀性變得更加容易。 希望這將允許您繼續流式傳輸而不會過早收集結果。
Java 8中最大的功能之一就是能夠流化對象集合。 通過將.stream()方法添加到Collection接口中,使用此新功能突然擴展了Java語言中的每個集合。 其他數據結構(例如Map-interface)不會實現該方法,因為它們并不是嚴格意義上的集合。
MapStream將使用兩個類型參數,一個鍵和一個值。 通過指定Map.Entry <K,V>作為類型參數,它還將擴展標準Stream接口。 這將允許我們直接從任何Java映射構造MapStream。
public interface MapStream<K, V> extends Stream<Map.Entry<K, V>> {... }多態性的概念告訴我們,只要新的返回類型是舊的返回類型的更具體的實現,子組件就可以更改覆蓋方法的返回類型。 我們將在定義MapStream接口時使用它,以便對于每個鏈接操作,都返回MapStream而不是Stream。
public interface MapStream<K, V> extends Stream<Map.Entry<K, V>> {@Override MapStream<K, V> filter(Predicate<? super Map.Entry<K, V>> predicate);@Override MapStream<K, V> distinct();@OverrideMapStream<K, V> sorted(Comparator<? super Map.Entry<K, V>> comparator);... }某些操作仍將需要返回普通Stream。 如果操作更改了流元素的類型,則我們無法確保新類型將是Map.Entry。 但是,我們可以添加其他方法以在具有鍵-值對的類型之間進行映射。
@Override<R> Stream<R> map(Function<? super Map.Entry<K, V>, ? extends R> mapper);<R> Stream<R> map(BiFunction<? super K, ? super V, ? extends R> mapper);除了允許用戶從條目映射到其他內容的功能外,他(她)還可以從鍵值對映射到其他內容。 當然,這很方便,但是由于我們正在使用值對,因此我們還可以添加更多特定的映射操作。
<R> MapStream<R, V> mapKey(BiFunction<? super K, ? super V, ? extends R> mapper);<R> MapStream<K, R> mapValue(BiFunction<? super K, ? super V, ? extends R> mapper);看起來差別不大,但是使用API??時,差別顯而易見:
// With MapsStream final Map<String, List<Long>> map = ...; MapStream.of(map).mapKey((k, v) -> k + " (" + v.size() + ")").flatMapValue((k, v) -> v.stream()).map((k, v) -> k + " >> " + v).collect(System.out::println);// Without MapStream final Map<String, List<Long>> map = ...; map.entrySet().stream().map(e -> new AbstractMap.SimpleEntry<>(e.getKey() + " (" + e.getValue().size() + ")"),e.getValue())).flatMap(e -> e.getValue().stream().map(v -> new AbstractMap.SimpleEntry<>(e.getKey(), v))).map(e -> e.getKey() + " >> " + e.getValue()).collect(System.out::println);- 可以在此處找到 MapStream的完整實現。 如果您對更酷的東西感興趣,請查看Speedment Github頁面 。 玩得開心!
翻譯自: https://www.javacodegeeks.com/2016/02/streaming-maps-java-8.html
總結
以上是生活随笔為你收集整理的使用Java 8在地图上流式传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机科学基础】LaTeX符号语法总结
- 下一篇: 打流工具trex使用