我有以下代码
public class Car {
Long carNum;
String carEngine;
}
List对象中的数据如下:
Car(carNum=1, carEngine=S02K),
Car(carNum=1, carEngine=null),
Car(carNum=2, carEngine=null),
Car(carNum=2, carEngine=S9K),
Car(carNum=3, carEngine=null)
我如何从汽车对象中筛选出数据
check fordistinct carNum如果有多个相似的carNum,则检查carEngine不为null的位置,并以列表的形式返回数据。
我可以使用不同的carNum
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
以如下方式:
carList.stream().filter(distinctByKey(Car::getCarNum)).collect(Collectors.toList());
上面的代码得到了不同的carNum,但是很有可能它会返回带有null carEngine的结果。
我如何检查carEngine不为null的地方沿着不同的carNum组合。
**注意:**如果只有一个不同的carNum没有carEngine,那么我应该返回该行沿着其他行。
例如:如果输入数据看起来像这样:
Car(carNum=1, carEngine=S02K),
Car(carNum=1, carEngine=null),
Car(carNum=2, carEngine=null),
Car(carNum=2, carEngine=S9K),
Car(carNum=3, carEngine=null)
则输出应为:
Car(carNum=1, carEngine=S02K),
Car(carNum=2, carEngine=S9K),
Car(carNum=3, carEngine=null)
请告诉我。谢谢大家!
4条答案
按热度按时间nbysray51#
我推荐使用带有merge函数的
toMap()
收集器来选择具有非空引擎的收集器:这样,如果有一个
carNum
只有空引擎,第一个引擎将保持最终结果。0dxa2lsx2#
predicate 提供了方法
and()
,它允许您使用逻辑AND合并两个 predicate 。返回一个复合 predicate ,该 predicate 表示此 predicate 与另一个 predicate 的短路逻辑AND。当计算组合 predicate 时,如果该 predicate 为false,则不计算另一个 predicate 。
示例:
**编辑:**需求更新后,需要分组,不需要过滤。有关正确的解决方案,请参阅answer from shmosel。
2nc8po8w3#
这里有一个办法。
carNum
。carNums
的每个集合,我首先检查carEngine
的所有集合都为空。如果是,我只返回集合中的第一个。印刷品
laximzn54#
过滤前使用
nullsLast
排序技巧是在distinct-filter之前使用nulls last进行排序:
您可以在过滤之前将此比较器传递给
Stream.sorted()
步骤。解决方案
打印汽车2和发动机:
在线试用:IDEone demo
参见
Comparator.nullsLast()