在Java 8中没有预定义方法的情况下将集合转换为另一种集合类型

Kon*_*ine 13 java collections java-8

我正在寻找的是一种使用地图将一种类型的集合转换为另一种类型的集合的方法WITHOUT具有将对象A转换为对象B的预定义函数/功能接口.Java 6示例:

for (ObjectA objA : collectionA) {
    ObjectB objB = new ObjectB();
    objB.setId(objA.getId());
    collectionB.add(objB);
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找以下内容:

List<ObjectB> collectionB = collectionA.stream().map(objA -> {
    ObjectB objB = new ObjectB();
    objB.setId(objA.getId());
    return objB;
});
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,但你得到了我正在努力做的事情的要点.

Kon*_*kov 14

执行映射后,您必须收集映射的对象:

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


Era*_*ran 7

您的示例代码只是缺少终端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());
Run Code Online (Sandbox Code Playgroud)

如果向ObjectB类添加一个接受类型参数ObjectA并设置 ID的构造函数,则可以简化代码:

即在ObjectB你添加这个构造函数:

public ObjectB (ObjectA objA)
{
    setId(objA.getId());
}
Run Code Online (Sandbox Code Playgroud)

你的代码变成:

List<ObjectB> collectionB = collectionA.stream()
                                       .map(ObjectB::new)
                                       .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)