You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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对应键的值。

运行结果

  1. 最终得到的j Map对象内容为:{1=2, 2=4, 3=6}
  2. 按要求的格式输出结果为:1-2 2-4 3-6

注意事项

上述实现仅适用于串行流场景,如果你使用并行流会导致元素处理顺序紊乱,得到的自增键和偶数的对应关系不符合预期,当前场景下串行流即可满足需求。

内容的提问来源于stack exchange,提问作者Ram Somani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:15:04