一、效果
用于取出两集合的差集,比如集合A和集合B,根据指定集合中对象的某一属性,求出集合A中有,而集合B中没有的数据集合。
二、源码
/**
* 两个集合A、B根据指定字段classifier,生成差集
* 此方法会生成[集合A中有,而集合B中没有]的数据列表
* 【注意】:指定的字段classifier在每个集合中唯一,否则转Map时会丢失数据
*
* @param subtrahend 集合A
* @param minuend 集合B
* @param classifier 指定字段
* @param <T> 泛型,集合中元素类型
* @param <K> 泛型,字段类型
* @return 返回生成的差集
*/
public static <T, K> List<T> diffSet(List<T> subtrahend, List<T> minuend, Function<? super T, ? extends K> classifier) {
Map<? extends K, T> subMap = listToMap(subtrahend, classifier);
Map<? extends K, T> minMap = listToMap(minuend, classifier);
for (Map.Entry<? extends K, T> tEntry : minMap.entrySet()) {
subMap.remove(tEntry.getKey());
}
return new ArrayList<>(subMap.values());
}
/**
* 根据指定的字段classifier,将list转为Map
* 【注意】:指定的字段classifier在list中唯一,否则转Map时会丢失数据
*
* @param subtrahend 集合
* @param classifier 指定字段
* @param <T> 泛型,集合中元素类型
* @param <K> 泛型,字段类型
* @return 生成的Map
*/
private static <T, K> Map<K, T> listToMap(List<T> subtrahend, Function<? super T, ? extends K> classifier) {
Map<K, T> map = new HashMap<>();
for (T t : subtrahend) {
K apply = classifier.apply(t);
map.put(apply, t);
}
return map;
}
三、使用方法
1.代码
package com.shs.business;
import com.alibaba.fastjson2.JSON;
import com.shs.business.domain.User;
import com.shs.common.utils.StringUtils;
import com.shs.common.utils.poi.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: HeyJarvis
* @Date: 2023/9/21 18:41
* @Description
*/
public class TestDiff {
public static void main(String[] args) {
//生成两个相同的集合
List<User> a = getUserList();
List<User> b = getUserList();
//模拟集合b缺少某两条数据
System.out.println(StringUtils.format("移除->{}", JSON.toJSONString(b.get(3))));
b.remove(3);
System.out.println(StringUtils.format("移除->{}", JSON.toJSONString(b.get(5))));
b.remove(5);
//求差集
List<User> diff = CollectionUtils.diffSet(a, b, User::getId);
System.out.println(StringUtils.format("差异->{}",JSON.toJSONString(diff)));
}
private static List<User> getUserList() {
List<User> result = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setId(String.valueOf(i));
user.setUserName(String.valueOf(i));
result.add(user);
}
return result;
}
}