场景:excel导入,按照excel的顺序排序,需要去重并且做分组判断,
首先我们去重:
List<OrdItem> ordItems=list.stream().filter(distinctByKey(o -> o.getPnId() + ";" + o.getCondition())).collect(Collectors.toList()); 注明:此处list 为传入的值, distinctByKey为内部方法
public static <T> Predicate<T> distinctByKey(Function<? super T,Object> keyExtractor){ Map<Object,Boolean> seen = new ConcurrentHashMap<>(); return t -> seen.putIfAbsent(keyExtractor.apply(t) == null ? "null" : keyExtractor.apply(t),Boolean.TRUE) == null; }
也可:List<OrdItem> ordItems = list.stream().collect(Collectors.collectingAndThen(Collectors. toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getPnId() + ";" + o.getCondition()))), ArrayList::new)); 直接去重
然后我们进行分组:
首先我为改之前的代码是这样的:
ordItems.stream() .collect(Collectors.groupingBy(OrdItem::getPnId)) .entrySet().stream().forEach(entry -> {
//业务操作
}
出现的问题:原本传入的list顺序被破坏,且无序
后修改为:
ordItems.stream() .collect(Collectors.groupingBy(OrdItem::getPnId,TreeMap::new, Collectors.toList())) .entrySet().stream().forEach(entry -> {
//业务操作
}
出现问题为:原本传入的list顺序被改变,有序,且可控制升降序排序
但是这两种都不能满足我的需求:
最后改成:
ordItems.stream() .collect(Collectors.groupingBy(OrdItem::getPnId, LinkedHashMap::new, Collectors.toList())) .entrySet().stream().forEach(entry -> {//业务操作}
使用了linkedHashMap 才满足了本次需求。