如何根据 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;
}
我有两个不同的表 Source
和 Target
,加入它们后我在查询输出中得到四列。我正在使用这四列的值构建 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())
));
我的 类 结构类似于:
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;
}
我有两个不同的表 Source
和 Target
,加入它们后我在查询输出中得到四列。我正在使用这四列的值构建 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())
));