如何使用Java merge方法向Map<Character,List<Integer>>的列表值追加元素
报错根因
- 你调用
Arrays.asList(t)生成的是定长列表,它是数组的轻量视图,不支持add()、remove()这类修改列表长度的操作,调用就会抛出UnsupportedOperationException - 重映射函数逻辑不符合
merge的设计语义:merge传入的重映射函数两个入参分别是当前key对应的旧值、你传入的默认新值,不需要再手动从map中二次查询对应key的列表,在重映射函数内操作原map也可能引发未知异常。
基于merge的正确实现
Map<Character, List<Integer>> map = new HashMap<>(); for (int i = 0; i < s.length(); i++) { int idx = i; map.merge( s.charAt(idx), // 初始值用可变ArrayList,避免定长列表问题 new ArrayList<>(List.of(idx)), // 重映射逻辑:直接往已存在的旧列表添加当前索引,返回旧列表即可 (oldList, newList) -> { oldList.add(idx); return oldList; } ); }
Java8兼容提示:如果使用Java8版本,将
List.of(idx)替换为Arrays.asList(idx)即可。
内容的提问来源于stack exchange,提问作者anupamD
相关产品推荐
相关产品推荐

