如何在java 8中将列表转换为具有设定值的地图

Jav*_*per -1 java java-8 java-stream

List<Hosting> list = new ArrayList<>();
list.add(new Hosting(1, "liquidweb.com"));
list.add(new Hosting(2, "aws.amazon.com"));
list.add(new Hosting(3, "digitalocean.com"));
list.add(new Hosting(2, "aws.amazon.com"));
Run Code Online (Sandbox Code Playgroud)

我想将上面的列表转换为Map<Integer, Set<String>>

1 -> {"liquidweb.com"}
2 -> {"aws.amazon.com"}
3 -> {"digitalocean.com"}
Run Code Online (Sandbox Code Playgroud)

如何在 Java 8 中进行转换?

Ous*_* D. 5

使用toMap

Map<Integer, Set<String>> result = list.stream()
                .collect(toMap(Hosting::getId,
                        e -> new HashSet<>(Collections.singleton(e.getValue())),
                        (l, r) -> {l.addAll(r); return l;}));
Run Code Online (Sandbox Code Playgroud)

或者:

使用groupingBywithmapping作为下游收集器:

Map<Integer, Set<String>> resultSet = list.stream()
          .collect(groupingBy(Hosting::getId, 
                       mapping(Hosting::getValue, toSet())));
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我更喜欢后者,因为它更具可读性。