如何使用Java8流API减少组的数量并返回排序列表
有没有一种更简单的方法可以使用reduce和sort执行以下groupBy操作?我想不出如何避免打开可选文件,或者为什么可选文件一开始就存在 给定的如何使用Java8流API减少组的数量并返回排序列表,java,Java,有没有一种更简单的方法可以使用reduce和sort执行以下groupBy操作?我想不出如何避免打开可选文件,或者为什么可选文件一开始就存在 给定的列表包含许多响应。对于每组Response实体(按taskId分组),我只希望该组的Response具有最新的submissionDateTime。submissionDateTime是响应实体上的可选 Comparator<Response> bySubmissionDate = Comparator.comparing( r
列表
包含许多响应。对于每组Response
实体(按taskId
分组),我只希望该组的Response
具有最新的submissionDateTime
。submissionDateTime
是响应
实体上的可选
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());
同样值得注意的是,submissionDateTime
是响应
界面上的可选
。实际的submissionDateTime
不是字段级别的可选的
。。。或者为什么一开始就有可选的
这是减少空流时的安全措施。在这种情况下最大值是多少?它是未知的,因此可能有也可能没有实际的返回值。这就是可选功能的用武之地
但在这种情况下,您始终可以调用Optional.get
,因为由groupingBy
生成的组永远不会为空。如果一个组中没有元素,那么就永远不会为它创建一个列表。(但是,还原收集器不知道这一点。)
你的方法很好
另外,您也可以直接使用maxBy
采集器
。。。或者为什么一开始就有可选的
这是减少空流时的安全措施。在这种情况下最大值是多少?它是未知的,因此可能有也可能没有实际的返回值。这就是可选功能的用武之地
但在这种情况下,您始终可以调用Optional.get
,因为由groupingBy
生成的组永远不会为空。如果一个组中没有元素,那么就永远不会为它创建一个列表。(但是,还原收集器不知道这一点。)
你的方法很好
另外,您还可以直接使用maxBy
采集器。这使它变得简单了一点。我认为没有必要将maxBy
包装在reduce
中
关于您提出的关于可选#get
必要性的问题:A假设原因是,在减少后,结果可能是“空的”。因此,该选项是可选的。
在您的情况下,如果Optional确实为空,则调用Optional#get
将导致异常。因为您执行了一个maxBy
操作,并且您的比较器处理null,所以我想您是在保存。否则你应该先过滤
responses.stream()
.collect(
Collectors.groupingBy(Response::getTaskId,
Collectors.maxBy(bySubmissionDate))).values().stream()
.map(Optional::get)
.collect(Collectors.toList());
另一个注意事项:您的submissionDateTime类型似乎是可选的。不建议使用选项作为字段类型。请参见这使它变得简单了一点。我认为没有必要将maxBy
包装在reduce
中
关于您提出的关于可选#get
必要性的问题:A假设原因是,在减少后,结果可能是“空的”。因此,该选项是可选的。
在您的情况下,如果Optional确实为空,则调用Optional#get
将导致异常。因为您执行了一个maxBy
操作,并且您的比较器处理null,所以我想您是在保存。否则你应该先过滤
responses.stream()
.collect(
Collectors.groupingBy(Response::getTaskId,
Collectors.maxBy(bySubmissionDate))).values().stream()
.map(Optional::get)
.collect(Collectors.toList());
另一个注意事项:您的submissionDateTime类型似乎是可选的。不建议使用选项作为字段类型。请参见该字段本身是一个OffsetDateTime
。可选
来自接口。对不起,我想我在我的问题中没有说清楚。@varcharmander不必道歉:)。在这种情况下,可能会使用getOptionalSubmissionDateTime,因为getter约定。只是一个旁注。该字段本身是一个OffsetDateTime
。可选
来自接口。对不起,我想我在我的问题中没有说清楚。@varcharmander不必道歉:)。在这种情况下,可能会使用getOptionalSubmissionDateTime,因为getter约定。只是旁注。