Java8如何将List过滤偶数后转换为键从1开始自增的Map
Java Stream 过滤偶数生成自增键Map解决方案
核心问题说明
你给出的基础代码无法直接填充Collectors.toMap()参数实现需求,原因是Stream默认不会维护元素的顺序索引,需要额外引入自增计数器实现键的生成。
正确实现代码
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; public class StreamTest { public static void main(String[] args) { List<Integer> h = Arrays.asList(1,2,3,4,5,6); // 定义从1开始的自增计数器 AtomicInteger autoIncrementKey = new AtomicInteger(1); Map<Integer,Integer> j = h.stream() .filter(fe->fe%2==0) .collect(Collectors.toMap( // 第一个参数:key生成函数,取当前计数器值后自增 k -> autoIncrementKey.getAndIncrement(), // 第二个参数:value生成函数,直接取流中当前偶数作为值 v -> v )); // 按要求格式输出 String output = j.entrySet().stream() .map(entry -> entry.getKey() + "-" + entry.getValue()) .collect(Collectors.joining(" ")); System.out.println(output); } }
toMap参数说明
Collectors.toMap需要传入两个核心函数参数:
- 第一个参数是键映射函数(Key Mapper):这里传入
k -> autoIncrementKey.getAndIncrement(),每处理一个过滤得到的偶数,就返回当前计数器值作为Map的键,随后计数器自增1,保证键是从1开始的唯一自增整数。 - 第二个参数是值映射函数(Value Mapper):这里传入
v -> v,直接把过滤得到的偶数作为Map对应键的值。
运行结果
- 最终得到的
jMap对象内容为:{1=2, 2=4, 3=6} - 按要求的格式输出结果为:
1-2 2-4 3-6
注意事项
上述实现仅适用于串行流场景,如果你使用并行流会导致元素处理顺序紊乱,得到的自增键和偶数的对应关系不符合预期,当前场景下串行流即可满足需求。
内容的提问来源于stack exchange,提问作者Ram Somani
相关产品推荐
相关产品推荐

