如何基于myDto对象中dogs列表首个元素排序myDto集合?
按MyDto中首个Dog的name排序列表
当然可以实现这个需求!你只需要修改排序用的Comparator逻辑,从每个MyDto对象中提取dogs列表的首个Dog的name属性作为排序依据即可。下面分两种场景给出实现方案:
1. 假设所有MyDto的dogs列表都非空
如果能确保每个MyDto的dogs列表至少包含一个Dog对象,直接用下面的代码就可以完成升序排序:
myDtoList.sort(Comparator.comparing( dto -> dto.getDogs().get(0).getName() ));
对应你给出的例子,这段代码会把三个条目按首个Dog的name从小到大排列,最终顺序就是条目3(Ann)→ 条目2(Fancy)→ 条目1(Zoro),完全符合你的预期。
2. 处理dogs列表为空的边界情况
如果存在dogs列表为空或者null的MyDto对象,上面的代码会抛出IndexOutOfBoundsException或NullPointerException。这时可以添加空值判断,把这类特殊对象统一排在最前面或最后面:
方式一:将空dogs的MyDto排在最前面
myDtoList.sort(Comparator.comparing( dto -> { if (dto.getDogs() == null || dto.getDogs().isEmpty()) { return null; } return dto.getDogs().get(0).getName(); }, Comparator.nullsFirst(String::compareTo) ));
方式二:将空dogs的MyDto排在最后面
myDtoList.sort(Comparator.comparing( dto -> { if (dto.getDogs() == null || dto.getDogs().isEmpty()) { return null; } return dto.getDogs().get(0).getName(); }, Comparator.nullsLast(String::compareTo) ));
如果不想用null,也可以用一个默认字符串(比如空串"")来替代,这样空dogs的MyDto会按默认字符串参与排序:
myDtoList.sort(Comparator.comparing( dto -> dto.getDogs() != null && !dto.getDogs().isEmpty() ? dto.getDogs().get(0).getName() : "" ));
内容的提问来源于stack exchange,提问作者Georgi Michev
相关产品推荐
相关产品推荐

