Lambda表达式(2)|(List对象集合去重)

Lambda表达式(2)|(List对象集合去重)


前言

本章节主要介绍java8的新特性Lambda表达式基于List实现根据object字段的对数据进行去重。

一、java8中Lambda是什么?

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符。

二、数据准备

1.创建实体

创造Object实体

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class EmployeeDto {
    private String id;
    private String name;
    private String no_id;
    private String dept;
    private int year;
    private EmpInfoPo info;
}

2.初始化数据

构建List实体数据

{"dept":"研发部1","id":"001","name":"员工1号","no_id":"YF001","year":2}
{"dept":"研发部2","id":"002","name":"员工2号","no_id":"YF001","year":5}
{"dept":"研发部3","id":"003","name":"员工3号","no_id":"YF001","year":7}
{"dept":"研发部4","id":"004","name":"员工4号","no_id":"YF001","year":6}
{"dept":"研发部5","id":"005","name":"员工5号","no_id":"YF001","year":4}
{"dept":"研发部6","id":"006","name":"员工1号","no_id":"YF001","year":2}

三、Lambda方式去重

1.对象去重方式

集合方式排序、stream方式排序对比
Collectors.collectingAndThen()数据流转处理函数
distinctByKey()自定义比较器

	/**
     * 函数去重  利用TreeSet无重复特性
     * collect 收集器
     * Collectors 收集器的方法
     */
    public static void exceptRepeatV1(List<EmployeeDto> employeeList){
        ArrayList<EmployeeDto> collect = employeeList
                .stream()
                .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(EmployeeDto::getName))), ArrayList::new));
        print(collect);
    }

    /**
     * 自定义方式去重
     * @param employeeList
     */
    public static void exceptRepeatV2(List<EmployeeDto> employeeList){
        List<EmployeeDto> collect = employeeList.stream()
                .filter(distinctByKey(e -> e.getName()))
                .collect(Collectors.toList());
        print(collect);
    }
    /**
     * lambda方式去重,存在重复的保留第一条
     * @param employeeList
     */
    public static void exceptRepeatV2(List<EmployeeDto> employeeList){
     	List<EmployeeDto> list= employeeList.stream()
             .collect(Collectors.toMap(EmployeeDto::getId, p -> p, (p1, p2) -> p1))
             .values()
             .stream()
             .collect(Collectors.toList());
     }  
    /**
     * 自定义比较方法
     * @param keyExtractor
     * @param <T>
     * @return
     */
    private static <T> Predicate<T> distinctByKey(Function<? super T,?> keyExtractor){
        Map<Object,Boolean> map=new ConcurrentHashMap<>();
        return t -> map.putIfAbsent(keyExtractor.apply(t),Boolean.TRUE)==null;
    }


去重结果

{"dept":"研发部1","id":"001","name":"员工1号","no_id":"YF001","year":2}
{"dept":"研发部2","id":"002","name":"员工2号","no_id":"YF001","year":5}
{"dept":"研发部3","id":"003","name":"员工3号","no_id":"YF001","year":7}
{"dept":"研发部4","id":"004","name":"员工4号","no_id":"YF001","year":6}
{"dept":"研发部5","id":"005","name":"员工5号","no_id":"YF001","year":4}

2.某个字段去重收集

例如:有一份用户排名名单,现在想要获取用户的id,每个用户排名取最靠前排名
LinkedHashSet数据不重复,且有序(插入的顺序不会变)。

//初始化参数
List<User> userList = new ArrayList<>();
userList.add(new User(4, "张三", 25));
userList.add(new User(2, "李四", 30));
userList.add(new User(3, "王五", 35));
userList.add(new User(2, "赵六", 40));

//去重代码
LinkedHashSet<Integer> collect = userList.stream().map(u -> u.getId()).collect(Collectors.toCollection(LinkedHashSet::new));
System.out.println("去重后的ID列表:" + collect);

去重结果

去重后的ID列表:[4, 2, 3]

2.非对象去重方式

集合方式排序、stream方式排序对比

//参数
List<Integer> userList1 = Lists.newArrayList(1,2,3,1,5);
//去重
List<Integer> dis = userList1.stream()
        .distinct()
        .collect(Collectors.toList());
//输出
[1, 2, 3, 5]

总结

以上就是Java8新特性Lambda表达式实现集合List去重常见的两种场景。后续会慢慢完善Lambda表达式的去重遍历过滤等

要使用Lambda表达式和Stream流去重,可以按照以下步骤进行操作: 1. 首先,使用Lambda表达式来定义一个集合,例如List或Set。 2. 使用stream()方法将集合转换为一个流,这样可以对流进行后续的操作。 3. 使用distinct()方法对流中的元素进行去重。该方法会根据元素的equals()方法进行比较。 4. 最后,可以使用collect()方法将流中的元素收集到一个新的集合中,例如List或Set。 下面是一个示例代码,展示了如何使用Lambda表达式和Stream流去重List<String> list = Arrays.asList("apple", "banana", "apple", "orange"); List<String> distinctList = list.stream() .distinct() .collect(Collectors.toList()); 在上面的代码中,我们定义了一个包含多个元素的List集合。然后我们使用stream()方法将该集合转换为一个流,接着使用distinct()方法对流中的元素进行去重,最后使用collect()方法将去重后的元素收集到一个新的List集合中。在这个例子中,去重后的集合中的元素为["apple", "banana", "orange"]。 通过以上步骤,我们就可以使用Lambda表达式和Stream流对集合中的元素进行去重操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Lambda 表达式 与 Stream流](https://blog.csdn.net/xx12321q/article/details/124126594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值