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
相关产品推荐
相关产品推荐

