我想使用Stream
来实现以下目标:
我有Input
和Output
对象的列表,这些对象具有完全不同的结构。
使用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
来显示一些虚拟代码。
答案 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
,但我发现这些代码更具可读性。