去掉List中所有重复对象
如果List中有两个重复的对象,把这两个对象都从List中取出。
代码块
List<Object> list = new ArrayList<>();
String str1 = new String("金");
String str2 = new String("木");
String str3 = new String("水");
String str4 = new String("火");
list.add("土");
list.add("金");
list.add("水");
list.add("火");
list.add(str1);
list.add(str2);
list.add(str3);
list.add(str4);
先将list转成map,对象为key,用 groupingBy 进行分组计算. 每个key出现的次数为这个map的value。
然后将这个map过滤,需要先用entrySet()转成set,将value值大于1的过滤掉。剩下的就是所有不重复的了。
//lambda表达式
List<Object> districtList1 = list.stream().collect(Collectors.groupingBy(p -> p,Collectors.counting()))
.entrySet().stream().filter(entry -> entry.getValue() == 1).map(Map.Entry::getKey).collect(Collectors.toList());
上面lambda表达式比较难看,下面可以变成普通代码就是这样。
Set<Object> set= new HashSet<>();
Map<Object,Integer> map = new HashMap<>();
list.stream().forEach(key -> {
set.add(key);//先用set去重
map.put(key, (map.get(key) == null ? 0 : map.get(key)) + 1);//同时也再map中记录下这个key出现过的次数
if(map.get(key) > 1){//如果出现的次数大于1,将这个key从set中去掉
set.remove(key);
}
});
List<Object> districtList2 = set.stream().collect(Collectors.toList());