Java List<T>获取 交集,差集

132 阅读1分钟

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);

    

个人记录,如有好的方法请指教,请留口德。