如何使用Streams将一种类型的List转换为另一种类型的List?

时间:2016-11-24 14:24:46

标签: java java-8 java-stream

我想使用Stream来实现以下目标:

我有InputOutput对象的列表,这些对象具有完全不同的结构。

使用for循环,我可以将List<Input>转换为List<Output>,如下所示:

for (Input input : listOfInput) {
    Output currentOutPutInstance = new Output();
    currentOutPutInstance.setArg1(input.getArg2());
    currentOutPutInstance.setArg2(input.getArg7());
    listOfOutPuts.add(currentOutPutInstance);
}

使用流我试过这样的事情:

private List<Output> getOutPutListFromInputList(List<Input> inPutList) {
    List<Output> outPutList = new ArrayList<Output>();
    outPutList = listOfPoolsInRun.stream.filter(<Somehow converting the input into output>)
                                 .collect(Collectors.toList()); 
}

注意:我不确定我应该使用哪种Stream方法。我只是用filter来显示一些虚拟代码。

2 个答案:

答案 0 :(得分:6)

使用map()Stream<Input>转换为Stream<Output>

private List<Output> getOutPutListFromInputList(List<Input> inPutList)
{
    return listOfPoolsInRun.stream()
                           .map(input -> {
                                Output out = new Output();
                                out.setArg1(input.getArg2());
                                out.setArg2(input.getArg7());
                                return out;
                            })
                           .collect(Collectors.toList()); 
}

如果在Output类中有适当的构造函数,可以缩短它:

private List<Output> getOutPutListFromInputList(List<Input> inPutList) 
{
    return listOfPoolsInRun.stream()
                           .map(input -> new Output(input.getArg2(),input.getArg7()))
                           .collect(Collectors.toList()); 
}

答案 1 :(得分:4)

将代码的这一部分作为方法:

OutPut createOutput(Input input) {
    OutPut currentOutPutInstance=new Output();
    currentOutPutInstance.setArg1(input.getArg2());
    currentOutPutInstance.setArg2(input.getArg7());
    return currentOutPutInstance;
}

然后只需map就可以了:

outPutList = listOfPoolsInRun.stream().map(this::createOutput).collect(Collectors.toList());

虽然没有必要使用专用方法createOutput,但我发现这些代码更具可读性。