官术网_书友最值得收藏!

1.9 收集到映射表中

假設我們有一個Stream<Person>,并且想要將其元素收集到一個映射表中,這樣后續就可以通過它們的ID來查找人員了。Collectors.toMap方法有兩個函數引元,它們用來產生映射表的鍵和值。例如,

在通常情況下,值應該是實際的元素,因此第二個函數可以使用Function.identity()。

如果有多個元素具有相同的鍵,那么就會存在沖突,收集器將會拋出一個Illegal-StateException對象。可以通過提供第3個函數引元來覆蓋這種行為,該函數會針對給定的已有值和新值來解決沖突并確定鍵對應的值。這個函數應該返回已有值、新值或它們的組合。

在下面的代碼中,我們構建了一個映射表,存儲了所有可用Locale中的每種語言,它在默認Locale中的名字(例如“German”)為鍵,而其本地化的名字(例如“Deutsch”)為值:

我們不關心同一種語言是否可能會出現2次(例如,德國和瑞士都使用德語),因此我們只記錄第一項。

注意:在本章中,我們使用Locale類作為感興趣的數據集的數據源。請參閱第7章以了解有關Locale的更多信息。

現在,假設我們想要了解給定國家的所有語言,這樣我們就需要一個Map<String,Set<String>>。例如,“Switzerland”的值是集[French,German,Italian]。首先,我們為每種語言都存儲一個單例集。無論何時,只要找到了給定國家的新語言,我們都會將已有集和新集做并操作。

在下一節中,你將會看到一種更簡單的用于獲取這種映射表的方式。

如果想要得到TreeMap,那么可以將構造器作為第4個引元來提供。你必須提供一種合并函數。下面是本節一開始所列舉的示例之一,現在它會產生一個TreeMap:

注意:對于每一個toMap方法,都有一個等價的可以產生并發映射表的toConcurrentMap方法。單個并發映射表可以用于并行集合處理。當使用并行流時,共享的映射表比合并映射表要更高效。注意,元素不再是按照流中的順序收集的,但是通常這不會有什么問題。

程序清單1-5中的示例程序給出了將流的結果收集到映射表中的示例。

程序清單1-5 collectin/CollectingIntoMaps.java

java.util.stream.Collector 8

·static<T,K,U>Collector<T,?,Map<K,U>>toMap(Function<?superT,?extendsK>keyMapper,Function<?super T,?extends U>valueMapper)

·static<T,K,U>Collector<T,?,Map<K,U>>toMap(Function<?superT,?extendsK>keyMapper,Function<?super T,?extends U>valueMapper,BinaryOperator<U>mergeFunction)

·static<T,K,U,M extends Map<K,U>>Collector<T,?,M>toMap(Function<?super T,?extends K>keyMapper,Function<?super T,?extends U>valueMapper,BinaryOperator<U>mergeFunction,Supplier<M>mapSupplier)

·static<T,K,U>Collector<T,?,ConcurrentMap<K,U>>toConcurrentMap(Function<?super T,?extends K>keyMapper,Function<?super T,?extends U>valueMapper)

·static<T,K,U>Collector<T,?,ConcurrentMap<K,U>>toConcurrentMap(Function<?super T,?extends K>keyMapper,Function<?super T,?extends U>valueMapper,BinaryOperator<U>mergeFunction)

·static<T,K,U,M extends ConcurrentMap<K,U>>Collector<T,?,M>toConcurrentMap(Function<?super T,?extends K>keyMapper,Function<?super T,?extends U>valueMapper,BinaryOperator<U>mergeFunction,Supplier<M>mapSupplier)

產生一個收集器,它會產生一個映射表或并發映射表。keyMapper和valueMapper函數會應用于每個收集到的元素上,從而在所產生的映射表中生成一個鍵/值項。默認情況下,當兩個元素產生相同的鍵時,會拋出一個IllegalStateException異常。你可以提供一個mergeFunction來合并具有相同鍵的值。默認情況下,其結果是一個HashMap或ConcurrentHashMap。你可以提供一個mapSupplier,它會產生所期望的映射表實例。

主站蜘蛛池模板: 娱乐| 日照市| 全州县| 富裕县| 娱乐| 西峡县| 湖州市| 藁城市| 兴山县| 饶阳县| 留坝县| 利川市| 中卫市| 武强县| 辽宁省| 垫江县| 彰化县| 双鸭山市| 德令哈市| 大石桥市| 包头市| 临安市| 九龙城区| 广德县| 大邑县| 漠河县| 庄浪县| 肃宁县| 邯郸市| 介休市| 大荔县| 台江县| 白朗县| 南京市| 古丈县| 长宁区| 石河子市| 万盛区| 明星| 彭水| 长兴县|