【发布时间】:2020-11-05 22:19:53
【问题描述】:
我有以下代码:
private List<CategoryModel> getReserveStockRuleMaxPriorityNavigationCategoryModel (Collection<CategoryModel> categoryModels){
return categoryModels.stream()
.map(NavigationCategoryModel.class::cast)
.sorted(Comparator.comparing(NavigationCategoryModel::getReserveStockRuleSetCategoryPriority, Comparator.nullsLast(Comparator.reverseOrder())))
.sorted(Comparator.comparing(navigationCategoryModel -> navigationCategoryModel.getReserveStockRuleSet().getCode(),Comparator.nullsLast(Comparator.naturalOrder())))
.collect(Collectors.toList());
}
有了这个,我的目标是进行两种排序,第一种是根据 reserveStockRuleSetCategoryPriority INT 进行反向排序,然后将具有属性 reserveStock.code 的 NavigationCategoryModel 放在列表的末尾。
但是,我得到了 NPE,因为在这个类别列表中,我可以接收带有属性 reserveStockRuleSet 为 null 的 NavigationCategoryModels。
我不想从排序中过滤和排除那些为空的,因为我想将它们放在列表的末尾
一个示例输入是:
NavCatModel priority : 500 , null reserveStockRuleSet
NavCatModel priority : 100 , NOT NULL reserveStockRuleSet
NavCatModel priority : 300 , null reserveStockRuleSet
NavCatModel priority : 200 , NOT NULL reserveStockRuleSet
两种排序后的预期结果:
NavCatModel priority : 200 , NOT NULL reserveStockRuleSet
NavCatModel priority : 100 , NOT NULL reserveStockRuleSet
NavCatModel priority : 500 , null reserveStockRuleSet
NavCatModel priority : 300 , null reserveStockRuleSet
如何修改此 lambda 以实现此输入/输出示例?
【问题讨论】:
-
看看logicbig.com/how-to/code-snippets/…,因为调用
.sorted两次不会达到你想要的效果。此外,我猜想在 getter 上防止 null 可能是这样的:```.sorted(nullsFirst(comparing(Object::getSomething, nullsFirst(naturalOrder()))) .thenComparing(nullsFirst(comparing(Object::getSomething, nullsFirst) (naturalOrder())))))
标签: java sorting lambda java-stream comparator