如何使用Java8流API减少组的数量并返回排序列表

如何使用Java8流API减少组的数量并返回排序列表,java,Java,有没有一种更简单的方法可以使用reduce和sort执行以下groupBy操作?我想不出如何避免打开可选文件,或者为什么可选文件一开始就存在 给定的列表包含许多响应。对于每组Response实体(按taskId分组),我只希望该组的Response具有最新的submissionDateTime。submissionDateTime是响应实体上的可选 Comparator<Response> bySubmissionDate = Comparator.comparing( r

有没有一种更简单的方法可以使用reduce和sort执行以下groupBy操作?我想不出如何避免打开可选文件,或者为什么可选文件一开始就存在

给定的
列表
包含许多响应。对于每组
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约定。只是旁注。