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

Java中在单个逻辑行拼接含单个元素列表的正确方法

静态final列表初始化的规范写法(替代双括号语法)

Java 8 兼容方案

要在Java 8里实现单行拼接已有列表+单个元素,可通过Stream.concat结合Stream.of组合不同数据源,最后转成列表:

不可变列表(推荐,符合static final常量设计)

private static final List<String> a = Collections.unmodifiableList(
    Stream.concat(Stream.concat(b.stream(), c.stream()), Stream.of(d, e))
          .collect(Collectors.toList())
);

可变ArrayList

如果确实需要可变的ArrayList,可以这样写:

private static final List<String> a = new ArrayList<>(
    Stream.concat(Stream.concat(b.stream(), c.stream()), Stream.of(d, e))
          .collect(Collectors.toList())
);

原理很简单:Stream.concat用来合并多个流,Stream.of把单个元素转成流,这样就能把两个列表和两个单个元素合并成一个流,再收集成列表。用Collections.unmodifiableList包装能保证列表不可修改,避免后续意外修改静态常量。

Java 9+ 更优方案

Java 9及以上版本有更简洁的写法,同时避免双括号语法的问题:

方案1:结合List.of和Stream

private static final List<String> a = List.of(
    Stream.concat(Stream.concat(b.stream(), c.stream()), Stream.of(d, e))
          .toArray(String[]::new)
);

方案2:用Stream.builder(Java 8也支持,但Java 9+配合不可变列表更顺手)

private static final List<String> a = Stream.<String>builder()
    .addAll(b)
    .addAll(c)
    .add(d)
    .add(e)
    .build()
    .collect(Collectors.toUnmodifiableList()); // Java 10+ 可用,直接生成不可变列表

方案3:Java 16+ 极简写法

Java 16新增的Stream.toList()直接返回不可变列表,写法更短:

private static final List<String> a = Stream.<String>builder()
    .addAll(b)
    .addAll(c)
    .add(d)
    .add(e)
    .build()
    .toList();

以上所有写法都不会创建匿名内部类,完全符合规范,同时在单个逻辑初始化语句内完成赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:46:03