- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 932字
- 2020-10-30 18:10:35
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,它會產生所期望的映射表實例。
- GitLab Cookbook
- TypeScript入門與實戰
- Building Modern Web Applications Using Angular
- Software Testing using Visual Studio 2012
- MATLAB應用與實驗教程
- Practical DevOps
- OpenStack Cloud Computing Cookbook(Fourth Edition)
- C++ 從入門到項目實踐(超值版)
- 零基礎學Python數據分析(升級版)
- Getting Started with Hazelcast(Second Edition)
- SQL基礎教程(第2版)
- C#開發案例精粹
- Mastering ArcGIS Enterprise Administration
- 時空數據建模及其應用
- Python面向對象編程(第4版)