当前位置: 首页 > news >正文

三种主要的重载方法

)两个参数的重载方法(最简单的形式)

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) { return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new); }

2)三个参数的重载方法(包含冲突处理)

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction) { return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new); }

3)四个参数的重载方法(指定Map实现)

public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier) { BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction); return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID); }

接下来,我们结合使用示例详细讲解。

2. 使用示例

2.1 将对象的某些属性转换为Map

假设有一个城市列表,需要将其转换为Map,其中Key为城市ID、Value为城市名称,转换方法如下所示:

@Getter @Setter public class City { private Integer cityId; private String cityName; public City(Integer cityId, String cityName) { this.cityId = cityId; this.cityName = cityName; } }
List<City> cityList = Arrays.asList( new City(1, "北京"), new City(2, "上海"), new City(3, "广州"), new City(4, "深圳") ); Map<Integer, String> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, City::getCityName)); System.out.println(cityMap);

输出结果:

2.2 将对象列表转换为Map(ID -> 对象)

仍然使用上面的城市列表,需要将其转换为Map,其中Key为城市ID、Value为城市对象,转换方法如下所示:

List<City> cityList = Arrays.asList( new City(1, "北京"), new City(2, "上海"), new City(3, "广州"), new City(4, "深圳") ); Map<Integer, City> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, city -> city)); City city = cityMap.get(1); System.out.println("城市ID: " + city.getCityId()); System.out.println("城市名称: " + city.getCityName());

输出结果如下所示:

城市ID: 1
城市名称: 北京

上面的写法等价于:

Map<Integer, City> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, Function.identity()));

因为Function.identity()内部实现是下面这样的:

static <T> Function<T, T> identity() { return t -> t; }

2.3 键冲突处理

假设上面的城市列表中有一个ID重复的城市:

List<City> cityList = Arrays.asList( new City(1, "北京"), new City(2, "上海"), new City(3, "广州"), new City(4, "深圳"), new City(4, "天津") ); Map<Integer, String> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, City::getCityName)); System.out.println("城市ID: 4, 城市名称: " + cityMap.get(4));

此时运行代码,会抛出java.lang.IllegalStateException异常,如下图所示:

有3种常见的键冲突处理方式,分别是保留旧值、使用新值和合并值,接下来一一讲解。

1)方式一:保留旧值

Map<Integer, String> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, City::getCityName, (oldValue, newValue) -> oldValue));

输出结果:

城市ID: 4, 城市名称: 深圳

2)方式二:使用新值

Map<Integer, String> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, City::getCityName, (oldValue, newValue) -> newValue));

输出结果:

城市ID: 4, 城市名称: 天津

3)方式三:合并值

Map<Integer, String> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, City::getCityName, (oldValue, newValue) -> oldValue + ", " + newValue));

输出结果:

城市ID: 4, 城市名称: 深圳, 天津

2.4 数据分组聚合

假设有一个销售记录列表,需要将其转换为Map,其中Key为销售员、Value为该销售员的总销售额,转换方法如下所示:

@Getter @Setter public class SalesRecord { private String salesPerson; private BigDecimal amount; public SalesRecord(String salesPerson, BigDecimal amount) { this.salesPerson = salesPerson; this.amount = amount; } }
List<SalesRecord> salesRecordList = Arrays.asList( new SalesRecord("张三", new BigDecimal("1000")), new SalesRecord("李四", new BigDecimal("2000")), new SalesRecord("张三", new BigDecimal("980")) ); Map<String, BigDecimal> salesRecordMap = salesRecordList.stream() .collect(Collectors.toMap(SalesRecord::getSalesPerson, SalesRecord::getAmount, BigDecimal::add)); System.out.println(salesRecordMap);

输出结果:

上面的例子是销售额累加,也可以只取最小值:

Map<String, BigDecimal> salesRecordMap = salesRecordList.stream() .collect(Collectors.toMap(SalesRecord::getSalesPerson, SalesRecord::getAmount, BigDecimal::min));

此时的输出结果:

或者只取最大值:

Map<String, BigDecimal> salesRecordMap = salesRecordList.stream() .collect(Collectors.toMap(SalesRecord::getSalesPerson, SalesRecord::getAmount, BigDecimal::max));

此时的输出结果:

2.5 指定Map实现

默认情况下,Collectors.toMap是将结果收集到HashMap中,如果有需要,我们也可以指定成TreeMap或者LinkedHashMap。

如果想要保持插入顺序,可以指定使用LinkedHashMap:

List<City> cityList = Arrays.asList( new City(2, "上海"), new City(1, "北京"), new City(4, "深圳"), new City(3, "广州") ); Map<Integer, String> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, City::getCityName, (existing, replacement) -> existing, LinkedHashMap::new)); System.out.println(cityMap);

输出结果:

如果想要按键排序,可以指定使用TreeMap:

List<City> cityList = Arrays.asList( new City(2, "上海"), new City(1, "北京"), new City(4, "深圳"), new City(3, "广州") ); Map<Integer, String> cityMap = cityList.stream() .collect(Collectors.toMap(City::getCityId, City::getCityName, (existing, replacement) -> existing, TreeMap::new)); System.out.println(cityMap);

输出结果:

http://www.gsyq.cn/news/1615223.html

相关文章:

  • 鲁L蒲公英6.30股市日记:日线密集,要选方向!
  • LTC6904与PIC18F26J11构建高精度方波信号发生器
  • AI算力展|2026上海AI算力节能及废热利用展览会【官网】
  • 一线观察:长期体验后发现的重庆会议系统工厂真实情况
  • 淘宝 / 天猫淘口令解析 API(提取真实商品 URL)返回值完整说明
  • PCB焊接技巧:QFN封装的手工焊接与返修——热风枪、焊台使用
  • 计算机毕业设计之房屋租赁管理系统的设计与实现
  • 如何快速配置Foobar2000逐字歌词插件:完整实战指南
  • 办公室想装得专业,前台、会议室和办公区别乱做
  • mba研究生论文文献综述怎么写
  • yansongda/pay支付证书管理实战指南:双平台安全架构深度解析
  • 从零开始掌握RoseTTAFold:蛋白质结构预测的终极实战指南
  • 小说下载器终极指南:如何永久保存你的网络小说收藏
  • 3分钟快速上手:ASMR下载神器asmroner终极使用指南
  • WiFi热图绘制终极指南:3分钟学会免费网络优化神器
  • Spring Boot集成Bouncy Castle实现SM2国密算法:前后端加密交互完整指南
  • LinkSwift网盘直链下载助手:告别限速,实现下载自由
  • 现代Web应用安全审计利器:VAuditDemo动态漏洞检测实战
  • 2026年专业塑胶跑道企业如何赢得市场好口碑?
  • 使用 React + Capacitor 构建 Android 混合应用外壳:集成扫码、定位与 NFC 功能实战
  • 月薪还不到五千的苦逼牛马们,花大几千考PMP,是“人傻钱多”还是“人间清醒”?
  • VM虚拟机鼠标键盘没反应求助
  • 导师喜欢什么样的MBA论文选题?3个标准+10个案例
  • 苹果17视频有美颜功能吗? 苹果17微信美颜设置方法
  • 网盘下载革命:LinkSwift直链下载助手全方位使用指南
  • ComfyUI Mixlab Nodes终极指南:如何快速构建AI创意应用
  • 做竞品分析用特易还是外贸公社?
  • agx orin使用gpio模拟pwm信号
  • Free - For - Dev 免费开发资源极速上手指南
  • 2026年乌鲁木齐精装装修厂家top5推荐,实践经验案例分享!