我正在寻找的方法是使用流和地图将一种类型的集合转换为另一种类型的集合,而不具备预定义的功能/功能将对象A转换为对象B的接口.Java 6示例:
for (ObjectA objA : collectionA) {
ObjectB objB = new ObjectB();
objB.setId(objA.getId());
collectionB.add(objB);
}
我正在寻找以下内容:
List<ObjectB> collectionB = collectionA.stream().map(objA -> {
ObjectB objB = new ObjectB();
objB.setId(objA.getId());
return objB;
});
这当然不起作用,但你得到了我想要做的事情的要点。
答案 0 :(得分:12)
执行映射后,您必须收集映射的对象:
List<ObjectB> collectionB = collectionA.stream().map(objA -> {
ObjectB objB = new ObjectB();
objB.setId(objA.getId());
return objB;
}).collect(Collectors.toList());
答案 1 :(得分:4)
您的示例代码只是缺少终端collect
操作,以便将Stream<ObjectB>
操作返回的map
元素收集到List<ObjectB>
:
List<ObjectB> collectionB = collectionA.stream().map(objA -> {
ObjectB objB = new ObjectB();
objB.setId(objA.getId());
return objB;
}).collect(Collectors.toList());
如果您向ObjectB
类添加一个接受ObjectA
类型参数并设置ID的构造函数,则可以简化代码:
即。在ObjectB
中添加此构造函数:
public ObjectB (ObjectA objA)
{
setId(objA.getId());
}
您的代码变为:
List<ObjectB> collectionB = collectionA.stream()
.map(ObjectB::new)
.collect(Collectors.toList());
答案 2 :(得分:0)
对于粉丝,
incompatible types: no instance(s) of type variable(s) R
exist so that java.util.stream.Stream<R> conforms to
java.util.List<org.class.Name>
在进行地图转换后,实际上意味着&#34;您将流的输出传递给一个不会将其作为参数&#34; (流映射转换本身实际上正在运行),或者您将其分配给不同类型的变量。
答案 3 :(得分:0)
您可以通过将第一个集合的引用传递给另一个集合参数化构造函数来直接转换它。
示例:
List<String> ff = new ArrayList<String>();
ff.add("AA");
ff.add("AA");
ff.add("cc");
ff.add("dd");
ff.add("ee");
System.out.println(ff.size());
HashSet<String> gg = new HashSet<>(ff);
System.out.println(gg.size());
for (String s: gg) {
System.out.println("output= " + s);
}
在另一个集合中,5的大小减少为4,因为List可以包含重复项,而Set则不包含重复项。
输出:
5
4
输出= AA
output = cc
output = dd
输出= ee