如何根据 java 中的内部对象的 属性 对列表进行排序 8

How to Sort List based on Inner Object's property in java 8

我的 类 结构类似于:

    class FinalResponse {
        Source source;
        List<Target> targets;
    }
    
    class Response {
    Source source;
    Target target;
   }

    class Source {
        Long sourceId;
        String sourceName;
    }
    
    class Target {
        Long targetId;
        String targetName;
    }

我有两个不同的表 SourceTarget,加入它们后我在查询输出中得到四列。我正在使用这四列的值构建 Response 对象。我在具有这 4 个属性 sourceId, sourceName, targetId, targetName 的 Response 对象中有数据。 我可以在多行上设置相同的 sourceId, sourceName,但 targetId, targetName 将始终不同。

我将所有 target 个对象分组到 source 相同的列表中。

List<FinalResponse> finalResponses = responses.stream()
    .collect(Collectors.groupingBy(
        Response::getSource,
        LinkedHashmap::new,
        Collectors.mapping(Response::getTarget, Collectors.toList())
    )) // Map<Source, List<Target>> is built
    .entrySet()
    .stream() // Stream<Map.Entry<Source, List<Target>>>
    .map(e -> new FinalResponse(e.getKey(), e.getValue()))
    .collect(Collectors.toList());

但有时无法对来自数据库的响应进行排序,即使它已排序并且我使用了 LinkedHashmap::new 然后我的最终输出 List<FinalResponse> finalResponses 也没有排序。 我希望我的最终输出按照 sourceId 排序,所以我做了:

finalResponses.sort(Comparator.comparing(finalResponse->finalResponse.getSource().getSourceId()));

它适用于非空值,但如果我在多行上有 source(sourceId=null,sourceName=null),那么我会得到 NullPointerException。 基于 Source 对象的 sourceId 属性 对集合进行排序的最佳方法是什么?

Comparator.nullsLast or Comparator.nullsFirst 应用于处理比较项目中可能的 null 值:

finalResponses.sort(Comparator.nullsLast(
    Comparator.comparing(fr -> fr.getSource().getSourceId())
));

或者像这样:

finalResponses.sort(Comparator.comparing(
    fr -> fr.getSource().getSourceId(),
    Comparator.nullsLast(Comparator.naturalOrder())
));