[英]Java compare two elements of objects in a list
我正在將列表中的一個對象轉換為使用流循環遍歷它們的另一個對象。
response.stream().map(res -> new Req(res.getId(),
res.getStartDate(), res.getEndDate())).collect(Collectors.toList());
響應對象具有所有對象的開始日期和結束日期,我將它們設置為 Req 對象。 現在 res 對象中的記錄可能在 startdate 和 enddate 之間存在差距,我想用最后一條記錄的 enddate 和下一條/當前記錄的 startdate 填補這些差距。
前任:
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
那么我的 Req 對象應該有如下記錄
startdate enddate
--------- ---------
01-01-2018 01-05-2018
01-05-2018 01-09-2018
01-09-2018 01-12-2018
01-12-2018 01-14-2018
01-14-2018 01-20-2018
01-20-2018 01-25-2018
我想在流中添加一個 if 條件並檢查列表的當前和下一個對象並在請求中添加額外的對象。 不確定這是否可以通過這種方式實現,或者我必須使用兩個 for 循環。
這對於流來說並不容易。 首先,您需要按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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.