【问题标题】:Mapping a List of values with another List of value using Java 8使用 Java 8 将值列表与另一个值列表映射
【发布时间】:2016-10-30 18:57:17
【问题描述】:

我不久前开始编程,我需要你的帮助。我有一个 Object1 的列表,一个 Object1 由 Item1、Item2、Item3 组成。

我想按 Item2 分组,将每个 Item2 映射到 Object1 的列表,然后 我想将每个 Object1 列表与 Item3 列表映射,然后最后我想计算每个 Item3 列表中不同 Item3 的数量。

简而言之,我想计算我的 Object1 列表中每个 Item2 拥有的 Item3 的数量。

为此,这是我迄今为止所做的:

Map<Item2, List<Object1>> object1GroupedByItem2 = object1List.stream().collect(Collectors.groupingBy(object1->object1.getItem2()));

List<Entry<Item2, List<Object1>>> object1GroupedByItem2List = object1GroupedByItem2.entrySet().stream().collect(Collectors.toList());

Map<Item2, List<Item3>> item3GroupedByItem2 = object1GroupedByItem2List.stream().collect(Collectors.toMap(entry->entry.getKey(),entry->entry.getValue().stream().map(object1->object1.getItem3()).collect(Collectors.toList())));

List<Entry<Item2, List<Item3>>> item3GroupedByItem2List = item3GroupedByItem2.entrySet().stream().collect(Collectors.toList());

Map<Item2, List<Item3>> distinctItem3GroupedByItem2 = item3GroupedByItem2List.stream().collect(Collectors.toMap(entry->entry.getKey(),entry->entry.getValue().stream().distinct().collect(Collectors.toList())));

List<Entry<Item2, List<Item3>>> distinctItem3GroupedByItem2List = distinctItem3GroupedByItem2.entrySet().stream().collect(Collectors.toList());

Map<Item2, Long> nbItem3PerItem2 = distinctItem3GroupedByItem2List.stream().collect(Collectors.toMap(entry->entry.getKey(),entry->entry.getValue().stream().count());

我几乎可以肯定,一定有更好的方法来做同样的事情,但我不知道如何...... 你能帮帮我吗?

提前致谢

编辑:

public class Object1 {

    private Item1 item1;
    private Item2 item2;
    private Item3 item3;

    public Object1(Item1 item1, Item2 item2, Item3 item3) {
        this.item1 = item1;
        this.item2 = item2;
        this.item3 = item3;
    }

    public Item1 getItem1() {
        return item1;
    }

    public void setItem1(Item1 item1) {
        this.item1 = item1;
    }

    public Item2 getItem2() {
        return item2;
    }

    public void setItem2(Item2 item2) {
        this.item2 = item2;
    }

    public Item3 getItem3() {
        return item3;
    }

    public void setItem3(Item3 item3) {
        this.item3 = item3;
    }   
}

Item1、Item2 和 Item3 只是包装一个字符串。

至于条目列表,我该如何摆脱它们?我不需要他们来制作我的地图吗?

【问题讨论】:

  • 您应该向我们展示 Object1、Item1、Item2 和 Item3 类的定义,以便我们清楚地了解它们之间的关系。并且你应该格式化你的代码以便它是可读的。
  • 我会首先摆脱条目列表。这些根本没有必要。
  • 这似乎是一场设计噩梦,您通常不会创建x1x2x3,而是创建对象的多个实例并将它们存储在数组/集合中。命名也很重要,您选择的名称非常模棱两可且令人困惑(即使我自己尝试在脑海中追踪)

标签: java dictionary java-stream


【解决方案1】:

这是我问题的答案:

Map<Item2, List<Object1>> object1GroupedByItem2 = object1List.stream().collect(Collectors.groupingBy(object1->object1.getItem2()));

Map<Item2, Long> nbItem3PerItem2 = object1GroupedByItem2.entrySet().stream().collect(Collectors.toMap(entry->entry.getKey(), entry->entry.getValue().stream().map(object1->object.getItem3()).distinct().count()));                                             

【讨论】:

  • 要正确地groupingBy,您必须为您的Item2 类实现equals/hashCode。同样Item3 需要equals/hashCode 用于 distinct() 过滤器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多