Java-java8-stream-ListUtils-按指定字段去重
package cn.jiangjiesheng.edu.utils;
import org.apache.commons.collections4.CollectionUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ListUtils {
private static volatile ListUtils instance = null;
private ListUtils() {
}
public static ListUtils getInstance() {
if (null == instance) {
synchronized (ListUtils.class) {
if (null == instance) {
instance = new ListUtils();
}
}
return instance;
}
return instance;
}
// <T,U extends Comparable<? super U>> 表示了当前代码逻辑中的类型限制,可以放在类名上,实际使用时,放在方法上和类名上,对于调用方还是会有区别的
// 在方法上加了<T,U extends Comparable<? super U>>: List<WxSessionVo> resultList = (ArrayList<WxSessionVo>) listUtils.getUniqueKeyList(list, WxSessionVo::getOpenid);
// 在类上加了<T> : ArrayList<WxSessionVo> resultList = (ArrayList<WxSessionVo>) listUtils.getUniqueKeyList(list, (Function<WxSessionVo, String>) wxSessionVo1 -> wxSessionVo1.getOpenid());
//TODO 后期看看能不能按指定的期望去重,大小值或者自定义的逻辑
public <T, U extends Comparable<? super U>> List<T> getUniqueKeyList(List<T> list, Function<? super T, ? extends U> function) {
if(CollectionUtils.isEmpty(list)){
return list;
}
List<T> resultList = list.stream().
collect(Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<T>(Comparator.comparing(function)))
, ArrayList::new));
// ArrayList<T> resultList2 = list.stream().
// collect(Collectors.collectingAndThen(
// Collectors.toCollection(
// () -> new TreeSet<>(Comparator.comparing(new Function<T, String>() {
// @Override
// public String apply(T t) {
// return t.getClass().getTypeName();
// }
// })))
// , ArrayList::new));
return resultList;
}
//
// public static void main(String[] args) {
// List<WxSessionVo> list = new ArrayList<>();
// WxSessionVo wxSessionVo = new WxSessionVo();
// wxSessionVo.setOpenid("111");
// wxSessionVo.setErrmsg("ok1");
// list.add(wxSessionVo);
// wxSessionVo = new WxSessionVo();
// wxSessionVo.setOpenid("111");
// wxSessionVo.setErrmsg("ok2");
// list.add(wxSessionVo);
//
// List<WxSessionVo> resultList = ListUtils.getInstance().getUniqueKeyList(list, WxSessionVo::getOpenid);
//
// Map<String, WxSessionVo> map = Maps.uniqueIndex(resultList, WxSessionVo::getOpenid);
// ImmutableListMultimap<String, WxSessionVo> map2 = Multimaps.index(list, WxSessionVo::getOpenid);
//
// System.out.println("Map="+ JSON.toJSONString(map));
// System.out.println("ImmutableListMultimap="+ JSON.toJSONString(map2.get("111")));
//
// }
}
正文到此结束