题目描述
lambda groupingBy高级问题 List<A>怎么转换成List<B>
题目来源及自己的思路
查了很多资料,发现大多数网上都是教怎么把List转换成Map<String,List>
我知道grupingBy方法有三个参数
按道理。。如果自己定义输出的容器B,然后再定义怎么收集,或许可以实现?
不知道怎么写...
相关代码
public class A{
private String name;
private String value;
}
public class B {
private String name;
private List<String> values;
}
List<A> list = new ArrayList<>();
list.add(new A("name1", "1"));
list.add(new A("name1", "2"));
list.add(new A("name2", "3"));
list.add(new A("name2", "4"));
list.add(new A("name2", "5"));
希望得到这样:
List<B>
[
{
"name":"name1"
"values":[
"1",
"2"
]
},
{
"name":"name2"
"values":[
"3",
"4",
"5"
]
}
]
谢邀
按照题主直观的问题需求来看,就是想要把
List<A>
通过stream
的groupingBy
怎么转换成List<B>
,我可以给一个肯定答复。。。当然是不可以鸭
因为只用
groupingBy
,它的返回,再怎么用几个参数,都只能是一个map
,肯定转化不成不是个B
,所以必须要在groupingBy
外用其他方式,比如像楼上的兄弟就是用groupingBy
之后,生成的map
再用entrySet
进行循环,如果把楼上兄弟的构造方法写到
B
类里,估计看起来会好看点这样的话,楼上兄弟的代码就可以这么写了
当然换个说法来讲,若是题主想要一次性完成,也不能叫一次性完成把,应该是换种方式去实现的话,也是可以的,因为从需求来看,少不了的处理必定是归类操作,还有就是收集操作,但是现成的归类操作的方法
groupingBy
最终的返回对象永远都是map
,所以我们可以来学groupingBy
返回的结果来构造一个类似groupingBy
方法的东西因为
groupingBy
的返回结果是一个Collector
,它是一个接口,所以我们就可以来定制一个该接口的实现类这个接口,之前我无意中写了一个Collector小笔记介绍了哈,感兴趣可以具体看看我对它的小理解,我这里时间原因,就直接给出实现类吧
另外
B
类里顺手多加了个构造方法结合我之前小笔记对
Collector
接口的描述,相信题主能够简单了解这个实现,有了这么一个收集器之后,那操作就简单了完成。。。emmm,就是这样吧,仅供参考,就酱