Java-向不可变列表添加一个元素
我需要一个不可变列表,我可以从中派生出第二个不可变列表,该列表保留前一个列表的所有元素以及 Java 中的一个附加元素(无需附加库)。
注意:这个问题类似于将单个元素添加到不可变集合的有效且优雅的方法是什么?但我需要一个清单,而且没有番石榴。
到目前为止我尝试过的:
var list = List.of(someArrayOfInitialElements);
var newList = Stream.concat(list.stream(), Stream.of(elementToAppend))
.collect(CollectorsCollectors.toUnmodifiableList());
这会起作用,但创建一个流并一个一个地复制元素对我来说似乎效率低下。鉴于List.of()将数据存储在基于字段或基于数组的数据结构中,您基本上可以批量复制内存。
有没有比使用流更有效的解决方案?我缺少的 Java 标准库中更好的数据结构?
回答
我会创建一个新的ArrayList附加元素,然后将其作为不可修改的列表返回。就像是,
private static <T> List<T> appendOne(List<T> al, T t) {
List<T> bl = new ArrayList<>(al);
bl.add(t);
return Collections.unmodifiableList(bl);
}
并测试它
public static void main(String[] args) {
List<String> al = appendOne(new ArrayList<>(), "1");
List<String> bl = appendOne(al, "2");
System.out.println(bl);
}
我得到(不出所料):
[1, 2]
请参阅在 IdeOne.com 上运行的此代码。