针对基本数据类型集合
public class DistinctDemo {
public static void main(String[] args) {
ArrayList<Integer> users = new ArrayList<>();
users.add(1);
users.add(2);
users.add(127);
users.add(127);
users.add(128);
users.add(128);
users.add(-128);
users.add(-128);
users.add(-129);
users.add(-129);
users.stream().distinct().forEach(u -> System.out.println(u));
}
}
针对对象集合
根据对象中的某一个成员变量进行去重
使用filter
根据集合中对象的某个成员变量进行去重
public class DistinctByVariableDemo {
public static void main(String[] args) {
ArrayList<User> users = new ArrayList<>();
users.add(new User("小明", 1));
users.add(new User("小力", 2));
users.add(new User("小明", 3));
users.add(new User("小为", 4));
users.add(new User("小和", 5));
users.stream().filter(distinctByVariable(u -> u.getName())).
forEach(fu -> System.out.println(fu.toString()));
}
/**
* putIfAbsent() 方法是
* 如果 key对应的value值不存在, key value 添加到 map 中,并返回 null
* 如果 key对应的value值已存在, key value 不再添加到 map 中, 并返回原 value
*
* 故 newKey(这里的newKey对应user对象中的name的值), 如果(newKey, Boolean.TRUE) 在map中已存在,
* putIfAbsent(newKey, Boolean.TRUE) 会返回 Boolean.TRUE (Boolean.TRUE 被final修饰,故其地址值唯一, 可用作比较)
* 然后判断是否等于 null, 返回false, filter接收到结果为false的Predicate并将该值过滤掉
* @param keyExtractor
* @param <T>
* @return
*/
private static <T> Predicate<T> distinctByVariable(Function<? super T, ?> keyExtractor) {
HashMap<Object, Boolean> map = new HashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
}