java lambda表达式 列表转map, key值相同的记录取时间字段最大的记录

本文介绍了一种利用Java Stream API结合Collector优化CustomerInfo数据处理的方法。通过将数据流转换为Map,使用BinaryOperator和Comparator确保了每个客户信息的唯一性,并保留了最新的ETL日期。这种方法提高了数据处理效率,减少了代码复杂度。
Map<String, CustomerInfo> infoMap = infoList.stream()
        .collect(Collectors.toMap(CustomerInfo::getId,
                customerInfo -> customerInfo, BinaryOperator.maxBy(Comparator.comparing(CustomerInfo::getEtlDate))));
Java 中,可以通过 Lambda 表达式结合 `Map` 的方法(如 `computeIfPresent`、`getOrDefault` 或者 `forEach`)来提指定键的。以下是一些常见的实现方式: ### 使用 `forEach` 遍历并筛选特定键 如果需要从 `Map` 中遍历并提某些符合条件的键对应的,可以使用 `forEach` 方法[^1]: ```java Map<String, Integer> map = new HashMap<>(); map.put("A", 1); map.put("B", 2); map.put("C", 3); // 提键为 "B" 的 map.forEach((key, value) -> { if ("B".equals(key)) { System.out.println("Key: " + key + ", Value: " + value); } }); ``` ### 使用 `getOrDefault` 获指定键的 如果已知目标键,可以直接通过 `getOrDefault` 来获,并提供一个默认作为备选[^3]: ```java Integer value = map.getOrDefault("B", 0); // 如果键不存在,则返回默认 0 System.out.println("Value for key 'B': " + value); ``` ### 使用 `computeIfPresent` 提并处理特定键的 如果需要在提的同时进行一些计算或处理,可以使用 `computeIfPresent` 方法[^4]: ```java map.computeIfPresent("B", (key, oldValue) -> { System.out.println("Found key: " + key + ", Value: " + oldValue); return oldValue; // 返回提后的 }); ``` ### 通过 Stream API 提多个符合条件的键的 如果希望基于某种条件从 `Map` 中提多个键的,可以利用 `Stream` 进行过滤和收集[^2]: ```java List<Integer> values = map.entrySet() .stream() .filter(entry -> entry.getKey().startsWith("A")) // 筛选以 A 开头的键 .map(Map.Entry::getValue) .toList(); System.out.println("Filtered Values: " + values); ``` ### 结合 Lambda 和 Stream 提对的部分信息 如果只需要提部分字段(例如键或者),可以进一步简化操作: ```java Set<String> keys = map.keySet() .stream() .filter(key -> key.length() > 1) .collect(Collectors.toSet()); Collection<Integer> valuesWithCondition = map.values() .stream() .filter(value -> value > 1) .collect(Collectors.toList()); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值