几个Java 8示例来向您展示如何将一个List
对象转换为一个Map
,以及如何处理重复的键
Hosting.java
- package com.mkyong.java8
-
- public class Hosting {
-
- private int Id;
- private String name;
- private long websites;
-
- public Hosting(int id, String name, long websites) {
- Id = id;
- this.name = name;
- this.websites = websites;
- }
-
- //getters, setters and toString()
- }
List到Map - Collectors.toMap()
创建Hosting
对象的List,Collectors.toMap
并将其转换为Map。
TestListMap.java
- package com.mkyong.java8
-
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.stream.Collectors;
-
- public class TestListMap {
-
- public static void main(String[] args) {
-
- List<Hosting> list = new ArrayList<>();
- list.add(new Hosting(1, "liquidweb.com", 80000));
- list.add(new Hosting(2, "linode.com", 90000));
- list.add(new Hosting(3, "digitalocean.com", 120000));
- list.add(new Hosting(4, "aws.amazon.com", 200000));
- list.add(new Hosting(5, "mkyong.com", 1));
-
- // key = id, value - websites
- Map<Integer, String> result1 = list.stream().collect(
- Collectors.toMap(Hosting::getId, Hosting::getName));
-
- System.out.println("Result 1 : " + result1);
-
- // key = name, value - websites
- Map<String, Long> result2 = list.stream().collect(
- Collectors.toMap(Hosting::getName, Hosting::getWebsites));
-
- System.out.println("Result 2 : " + result2);
-
- // Same with result1, just different syntax
- // key = id, value = name
- Map<Integer, String> result3 = list.stream().collect(
- Collectors.toMap(x -> x.getId(), x -> x.getName()));
-
- System.out.println("Result 3 : " + result3);
- }
- }
Output
- Result 1 : {1=liquidweb.com, 2=linode.com, 3=digitalocean.com, 4=aws.amazon.com, 5=mkyong.com}
- Result 2 : {liquidweb.com=80000, mkyong.com=1, digitalocean.com=120000, aws.amazon.com=200000, linode.com=90000}
- Result 3 : {1=liquidweb.com, 2=linode.com, 3=digitalocean.com, 4=aws.amazon.com, 5=mkyong.com}
2.列出Map - 重复键
2.1运行下面的代码,重复的关键错误将被抛出!
TestDuplicatedKey.java
- package com.mkyong.java8;
-
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.stream.Collectors;
-
- public class TestDuplicatedKey {
-
- public static void main(String[] args) {
-
- List<Hosting> list = new ArrayList<>();
- list.add(new Hosting(1, "liquidweb.com", 80000));
- list.add(new Hosting(2, "linode.com", 90000));
- list.add(new Hosting(3, "digitalocean.com", 120000));
- list.add(new Hosting(4, "aws.amazon.com", 200000));
- list.add(new Hosting(5, "mkyong.com", 1));
-
- list.add(new Hosting(6, "linode.com", 100000)); // new line
-
- // key = name, value - websites , but the key 'linode' is duplicated!?
- Map<String, Long> result1 = list.stream().collect(
- Collectors.toMap(Hosting::getName, Hosting::getWebsites));
-
- System.out.println("Result 1 : " + result1);
-
- }
- }
输出 - 下面的错误信息有点误导,应该显示“linode”而不是键的值。
- Exception in thread "main" java.lang.IllegalStateException: Duplicate key 90000
- at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
- at java.util.HashMap.merge(HashMap.java:1245)
- //...
2.2要解决上述重复的关键问题,请传入第三个mergeFunction参数,如下所示:
- Map<String, Long> result1 = list.stream().collect(
- Collectors.toMap(Hosting::getName, Hosting::getWebsites,
- (oldValue, newValue) -> oldValue
- )
- );
Output
Result 1 : {..., aws.amazon.com=200000, linode.com=90000}
3.3尝试newValue
- Map<String, Long> result1 = list.stream().collect(
- Collectors.toMap(Hosting::getName, Hosting::getWebsites,
- (oldValue, newValue) -> newvalue
- )
- );
Output
Result 1 : {..., aws.amazon.com=200000, linode.com=100000}
3.列出Map- 排序Collect
TestSortCollect.java
- package com.mkyong.java8;
-
- import java.util.*;
- import java.util.stream.Collectors;
-
- public class TestSortCollect {
-
- public static void main(String[] args) {
-
- List<Hosting> list = new ArrayList<>();
- list.add(new Hosting(1, "liquidweb.com", 80000));
- list.add(new Hosting(2, "linode.com", 90000));
- list.add(new Hosting(3, "digitalocean.com", 120000));
- list.add(new Hosting(4, "aws.amazon.com", 200000));
- list.add(new Hosting(5, "mkyong.com", 1));
- list.add(new Hosting(6, "linode.com", 100000));
-
- //example 1
- Map result1 = list.stream()
- .sorted(Comparator.comparingLong(Hosting::getWebsites).reversed())
- .collect(
- Collectors.toMap(
- Hosting::getName, Hosting::getWebsites, // key = name, value = websites
- (oldValue, newValue) -> oldValue, // if same key, take the old key
- LinkedHashMap::new // returns a LinkedHashMap, keep order
- ));
-
- System.out.println("Result 1 : " + result1);
-
- }
- }
Output
Result 1 : {aws.amazon.com=200000, digitalocean.com=120000, linode.com=100000, liquidweb.com=80000, mkyong.com=1}
文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树行为抽象和Lambda流和行为抽象141377 人正在系统学习中