是否有一個簡單的方法來做以下groupBy減少和排序?我無法弄清楚如何避免必須拆開可選或爲什麼可選項甚至在那裏開始。如何減少組和返回一個排序列表與Java 8流API
給定List<Response>
包含許多回應。對於每組Response
實體(按taskId
分組),我只希望該組的Response
最新的submissionDateTime
。 submissionDateTime
是Response
實體上的Optional<OffsetDateTime>
。
Comparator<Response> bySubmissionDate = Comparator.comparing(
r -> r.getSubmissionDateTime().orElse(OffsetDateTime.MAX)
);
List<Response> responses = responses.stream()
.collect(Collectors.groupingBy(
Response::getTaskId,
Collectors.reducing(maxBy(bySubmissionDate))
)).values().stream()
.map(Optional::get)
.sorted(bySubmissionDate)
.collect(Collectors.toList());
當然,必須有更好的方法來做到這一點。最終的順序很重要,因此最終的標準爲.sorted(bySubmissionDate)
。
編輯 給出的答覆,我已經能夠減少代碼如下:另外值得注意的
List<Response> responses = responses.stream()
.collect(Collectors.groupingBy(
ResponseComplete::getTaskId,
Collectors.maxBy(bySubmissionDate)
)).values().stream()
.map(Optional::get)
.sorted(bySubmissionDate)
.collect(Collectors.toList());
,submissionDateTime
是Response
接口上Optional<OffsetDateTime>
。實際的submissionDateTime
不是字段級的Optional
。
該字段本身是一個'OffsetDateTime'。 'Optional'來自接口。對不起,我認爲我沒有在我的問題中說清楚。 –
varcharmander
@varcharmander不需要對不起:)。在這種情況下,由於getter約定,可能使用getOptionalSubmissionDateTime。只是一個側面說明。 –