【问题标题】:How to convert the following Stream to a Pojo如何将以下 Stream 转换为 Pojo
【发布时间】:2020-06-10 06:08:56
【问题描述】:

数据表示如下

部门 |计数 |名字

一个 | 5 |拉梅什

一个 | 2 |阿洛克

b | 4 |苏雷什

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

【问题讨论】:

  • 为什么是这样的:Arrays.asList("a", "5", "Ramesh"),你为什么不把它构建成pojo呢?您可以使用流的地图功能来做您想做的事情。
  • 我从数据库中获取它,所以它是行格式的
  • 好吗?为什么不直接将其作为 POJO 列表获取,而不是稍后映射它们?
  • 你有没有看我的问题,但它的列表?stackoverflow.com/questions/35790723/…
  • @soorapadman 他可以轻松地将他的数据从他的数据库中直接读取到所需的类型。 “事后映射”是多余的。

标签: java java-8 java-stream


【解决方案1】:

正如 cmets 中已经指出的那样,您绝对应该尝试直接将数据作为 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&lt;Counter&gt; counters)public Counter(int count, String name)

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

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2018-01-15
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多