Java List获取 交集,差集
import lombok.AllArgsConstructor;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
@AllArgsConstructor
public class ArrayPlusUtil<T, R> {
private List<T> leftList;
private List<T> rightList;
/**
* 获取交集
*/
public List<T> intersection(Function<T, R> column) {
return leftList.stream().filter(res -> rightList.stream().anyMatch(res1 -> column.apply(res).equals(column.apply(res1)))).collect(Collectors.toList());
}
/**
* 差集(左边有的,右边没有)
*/
public List<T> differenceSetLeft(Function<T, R> column) {
return leftList.stream().filter(res -> rightList.stream().noneMatch(res1 -> column.apply(res).equals(column.apply(res1)))).collect(Collectors.toList());
}
/**
* 差集(右边有的,左边没有)
*/
public List<T> differenceSetRight(Function<T, R> column) {
return rightList.stream().filter(res -> leftList.stream().noneMatch(res1 -> column.apply(res).equals(column.apply(res1)))).collect(Collectors.toList());
}
}
使用例子:创建一个对象 作为list 元素对象;
import lombok.Data;
import java.io.Serializable;
@Data
public class RoleMenu implements Serializable {
/**
* 角色
*/
private Integer roleId;
/**
* 权限
*/
private Integer menuId;
}
使用工具
List<RoleMenu> newRoleMenus = new ArrayList<>();
List<RoleMenu> oldRoleMenus = new ArrayList<>();
ArrayPlusUtil<RoleMenu, Integer> arrayPlusUtil = new ArrayPlusUtil<>(newRoleMenus, oldRoleMenus);
List<RoleMenu> roleMenuUpdateList = arrayPlusUtil.intersection(RoleMenu::getMenuId);
List<RoleMenu> differenceSetRight = arrayPlusUtil.differenceSetRight(BgRoleMenu::getMenuId);
List<RoleMenu> differenceSetLeft = arrayPlusUtil.differenceSetLeft(BgRoleMenu::getMenuId);
个人记录,如有好的方法请指教,请留口德。