【问题标题】:converting List<A> to Map<String,List<A>> using java 8 stream API使用 java 8 流 API 将 List<A> 转换为 Map<String,List<A>>
【发布时间】:2018-02-15 03:57:53
【问题描述】:

我有以下代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        Test t=new Test();
        t.test();
    }

    class A
    {
        int id;
        B b;

        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public B getB() {
            return b;
        }
        public void setB(B b) {
            this.b = b;
        }

    }

    class B
    {
        int id;
        String unique;

        public String getUnique() {
            return unique;
        }
        public void setUnique(String unique) {
            this.unique = unique;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
    }

    public void test()
    {
        B b1=new B();
        b1.setId(9999);
        b1.setUnique("123456789");

        B b2=new B();
        b2.setId(7777);
        b1.setUnique("123456789");

        B b3=new B();
        b3.setId(8888);
        b3.setUnique("987654321");


        A a1=new A();
        a1.setId(1);;
        a1.setB(b1);

        A a2=new A();
        a2.setId(2);;
        a2.setB(b1);


        A a3=new A();
        a3.setId(3);;
        a3.setB(b2);

        A a4=new A();
        a4.setId(4);;
        a4.setB(b2);

        A a5=new A();
        a5.setId(5);;
        a5.setB(b3);

        A a6=new A();
        a6.setId(6);;
        a6.setB(b3);

        List<A> list=new ArrayList<A>();
        list.add(a1);
        list.add(a2);
        list.add(a3);
        list.add(a4);
        list.add(a5);
        list.add(a6);



        Map<B,List<A>> map=list.stream()
                               .collect(Collectors.groupingBy(A::getB));

        //required output
        //Map<String, List<A>>

    }
}

在这个例子中,我有一个class A,它的引用是class B。 B 类 有一个名为unique 的字段。作为来源,我得到了引用 B 类对象(b1、b2 和 b3)的列表(a1 到 a6)。对象 b1 和 b2 包含相同的唯一值。我想要使​​用 Java 8 Stream API 的输出,它将返回 Map>,这样如果 A 引用的对象 B 的唯一值相同,则结果列表应包含列表中 A 类对象的合并。例如以下应该是输出

Map<String,List<A>> output = [
                                 "123456789" : [a1,a2,a3,a4],
                                 "987654321" : [a5,a6]
                             ]

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    修复了这条线(它是b1,但本来应该是b2):

    b2.setUnique("123456789");
    

    正确的映射代码是这样的:

    Map<String,List<A>> map=list.stream()
        .collect(Collectors.groupingBy(p -> p.getB().unique));
    

    输出(A 由{ID} 表示)是这样的:

    {123456789=[{1}, {2}, {3}, {4}], 987654321=[{5}, {6}]}
    

    【讨论】:

    • 也可以考虑为B添加equals和hashcode
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2023-03-26
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多