【问题标题】:Map List<> to Map<Integer, Set> with additional transformation将 List<> 映射到 Map<Integer, Set> 并进行附加转换
【发布时间】:2021-04-11 18:26:15
【问题描述】:

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

例如,有一个 List&lt;Dog&gt;,我想将其转换为 HashMap,其中键是狗的年龄,值是品种的 Set

@Getter //lombok for getters
public class Dog {
    private String name;
    private int age;
    private int breed;
}

我可以使用这个语句创建Map&lt;Integer, Set&lt;Dog&gt;&gt; dogsByAgea。

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

不过我需要Map&lt;Integer, Set&lt;String&gt;&gt; breedsByAge

这可能使用流吗?

【问题讨论】:

  • 这绝对是可能的,但您似乎没有足够的属性来建立唯一性……您可以轻松拥有两个年龄、姓名和品种相同的Dogs。显示完整的 Dog 类,包括 hashCode()equals() 方法(你确实有这些,对吗?)。
  • groupingBy(Dog::getAge, Collectors.mapping(Dog::getBreed, toSet))
  • @JimGarrison 我不需要唯一性,集合的重点是避免结果中出现重复的品种。 @Data不好选,应该​​有@Getter

标签: java java-stream


【解决方案1】:

以下应满足要求:

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

演示:

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);
    }
}

输出:

{5=[1, 4], 10=[1, 2, 3]}

【讨论】:

    猜你喜欢
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多