在Java 8中,如何将一个集合转换为另一种类型的集合而没有预定义的方法?

20
我希望的是一种使用映射的方法将一种类型的集合转换为另一种类型的集合,而不需要预定义一个将对象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;
});

当然这并不奏效,但你能大概理解我试图做什么。

4个回答

20

完成映射后,您需要收集映射的对象:

List<ObjectB> collectionB = collectionA.stream().map(objA -> {
    ObjectB objB = new ObjectB();
    objB.setId(objA.getId());
    return objB;
}).collect(Collectors.toList());

7

你的示例代码只是简单地缺少了collect操作,来将你的map操作返回的Stream<ObjectB>元素收集到一个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());

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

在另一个集合中,由于List可以包含重复项,因此5的大小被减少到4,而Set则不会。

输出:

5

4

output = AA

output = cc

output = dd

output = ee


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>

在执行映射转换后,实际上意味着“您正在将流的输出传递给不接受该参数的方法”(流映射转换本身实际上是有效的),或者您正在将其分配给不同类型的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接