将 List<> 映射到 Map<Integer, Set> 并附加转换

Mic*_*hal 3 java java-stream

我需要将一个对象列表转换为一个对象属性集的映射,我想为此使用 Java 流。

例如,有一个List<Dog>,我想将它转换为一个HashMap,其中关键是狗的年龄,价值是Set品种。

@Getter //lombok for getters
public class Dog {
    private String name;
    private int age;
    private int breed;
}
Run Code Online (Sandbox Code Playgroud)

我可以Map<Integer, Set<Dog>> dogsByAge使用此语句创建一个。

Map<Integer, Set<Dog>> dogsByAge = dogs.stream()
                                       .collect(groupingBy(Dog::getAge, toSet()));
Run Code Online (Sandbox Code Playgroud)

不过我需要 Map<Integer, Set<String>> breedsByAge

可以使用流吗?

Arv*_*ash 6

以下内容应符合要求:

Map<Integer, Set<Integer>> breedsByAge = dogs.stream()
                .collect(Collectors.groupingBy(Dog::getAge, Collectors.mapping(Dog::getBreed, Collectors.toSet())));
Run Code Online (Sandbox Code Playgroud)

演示:

public class Main {
    public static void main(String[] args) {
        List<Dog> dogs = List.of(new Dog("A", 10, 1), new Dog("B", 5, 1), new Dog("C", 10, 2), new Dog("D", 10, 3),
                new Dog("E", 5, 4));

        Map<Integer, Set<Integer>> breedsByAge = dogs.stream()
                .collect(Collectors.groupingBy(Dog::getAge, Collectors.mapping(Dog::getBreed, Collectors.toSet())));

        System.out.println(breedsByAge);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

{5=[1, 4], 10=[1, 2, 3]}
Run Code Online (Sandbox Code Playgroud)