使用Java 8将值列表映射到另一个值列表

时间:2016-10-30 18:57:18

标签: java dictionary java-stream

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

我想按Item2分组,然后用Object1的List映射每个Item2 我想用Item3的List列出每个Object1的List,然后我想计算Item3的每个List中不同的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只包装一个String。

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

1 个答案:

答案 0 :(得分:0)

以下是我的问题的答案:

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