我正在将列表中的一个对象转换为另一对象,并通过流对其进行循环。
FOR CHANNEL 'master-1'
响应对象的所有对象都有开始日期和结束日期,我将它们设置为Req对象。现在res对象中的记录可能在开始日期和结束日期之间存在间隙,我想用上一个记录的结束日期和下一个/当前记录的开始日期来填充这些间隙。
例如:
response.stream().map(res -> new Req(res.getId(),
res.getStartDate(), res.getEndDate())).collect(Collectors.toList());
然后我的Req对象应该具有以下记录
startdate enddate
--------- ---------
01-01-2018 01-05-2018
01-05-2018 01-09-2018
01-12-2018 01-14-2018
01-20-2018 01-25-2018
我想在流中添加一个if条件,并检查列表的当前和下一个对象,并在请求中添加其他对象。不确定是否可以通过这种方式实现,否则我必须使用两个for循环。
答案 0 :(得分:1)
使用流并不是那么容易。首先,您需要按startDate
对响应进行排序:
List<Response> sorted = responses.stream()
.sorted(Comparator.comparing(Response::getStartDate))
.collect(Collectors.toList());
比创建一个将从Response
转换为Request
的方法:
private static Request fromResponse(Response response) {
return new Request(response.getStartDate(), response.getEndDate(), response.getId());
}
最后进行流操作:
List<Request> req = IntStream.range(0, sorted.size())
.boxed()
.flatMap(x -> {
if (x == responses.size() - 1) {
return Stream.of(fromResponse(responses.get(x)));
}
Response left = responses.get(x);
Response right = responses.get(x + 1);
if (!left.getEndDate().equals(right.getStartDate())) {
Response oneMore = new Response(
left.getEndDate(),
right.getStartDate(),
left.getId());
return Stream.of(fromResponse(left), fromResponse(oneMore));
} else {
return Stream.of(fromResponse(left));
}
})
.collect(Collectors.toList());