使用java8的stream流指定key去重办法

在使用java8的stream流时,可以使用

list.stream().distinct().collect(Collectors.toList());

方法来对list中的对象进行去重,但是这个方法需要list中保存的类重写对应的equals方法以及hashCode方法。但是如果我们只是需要根据对象的某个属性来去重,怎么办呢?

我们可以使用一个取巧的办法,通过stream流中key转map的方法将数据转成一个Map对象,之后读取Map中的values值来获取去重后的List。

主要代码:

Map<String, User> map = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (v1, v2) -> v1));
list = new ArrayList<>(map.values());

其中(v1,v2)->v1位置可以自己实现当key冲突之后,去重规则是怎样的,即保留哪个值。

完整测试代码:

public class Test {

    public static void main(String[] args) {
        //获取数据
        List<User> list = getList();

        //去重
        Map<String, User> map = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (v1, v2) -> v1));
        list = new ArrayList<>(map.values());

        //打印数据
        printList(list);
    }

    private static List<User> getList() {
        return Arrays.asList(
                new User("小赵",20),
                new User("小钱",9),
                new User("小赵",18),
                new User("小李",13)
        );
    }

    private static void printList(List list){
        list.forEach(System.out::println);
        System.out.println("==============\n");
    }

}

@Data
@ToString
@AllArgsConstructor
class User{

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

}

觉得内容还不错?打赏个钢镚鼓励鼓励!!👍