首页 > 解决方案 > 如何将以下 Stream 转换为 Pojo

问题描述

数据表示如下

部门 | 计数 | 姓名

一个 | 5 | 拉梅什

一个 | 2 | 阿洛克

乙 | 4 | 苏雷什

乙 | 5 | 阿诺德

c | 4 | 布赖恩

c | 5 | 桑托什

c | 5 | 拉梅什

我想转换以下列表

List<Object[]> departWiseDistinctNameCount = Arrays.asList(Arrays.asList("a", "5", "Ramesh"), Arrays.asList("a", "2", "Alok"), Arrays.asList("b", "4", "Suresh"), Arrays.asList("b", "5", "Arnold"), Arrays.asList("c", "4", "Brian"), Arrays.asList("c", "5", "Santosh"), Arrays.asList("c", "5", "Ramesh"));

到 POJO

   class Dept {
    private String deptName;
    List<Counter> counters;
  }

    class Counter{
       private int count;
       private String name;
  }

标签: javajava-8java-stream

解决方案


正如评论中已经指出的那样,您绝对应该尝试直接将数据作为 POJO 列表获取。

但是,您要求一种映射列表的方法,因此您可以这样做:

departWiseDistinctNameCount.stream()
            .collect(Collectors.groupingBy(l -> l.get(0),
                    Collectors.mapping(l -> new Counter(Integer.parseInt(l.get(1)), l.get(2)),
                            Collectors.toList())))
            .entrySet().stream().map(e -> new Dept(e.getKey(), e.getValue())).collect(Collectors.toList())

为了澄清:我添加了构造函数public Dept(String deptName, List<Counter> counters)public Counter(int count, String name).

此外,您声明的语句departWiseDistinctNameCount实际上会导致编译错误,因为 aList<List<String>>不能强制转换为 a List<Object[]>。我假设 a List<List<String>>,但如果你只有后者,你可以通过使用(String) l[0]而不是l.get(0)等轻松地在流中转换。


推荐阅读