2 回答
TA贡献1834条经验 获得超8个赞
Arrays.asList
除了通过反射之外,您无法改变底层数组(或 返回的列表)。然而,数组在这里并不真正相关。不要混淆数组和列表!从 Java 9 开始,
List.of(0, 1, 2, 3)
实现了相同的目标。要执行生成新集合的操作,您必须通过streams。您可能还想考虑第三方库,例如Guava(此链接指向其不可变集合页面)。或者甚至更好的PCollections,它只提供不可变的集合以及比 Guava 更实用的实现。
TA贡献1898条经验 获得超8个赞
使用的问题Collections.unmodifiableList
在于,您并不是真正在可变集合上创建只读视图,而不是真正的不可变集合。这看起来似乎没什么大不了的,但实际上,充当不可变的可变集合不会非常高效和高性能。例如,将新元素追加到列表中需要复制整个列表。
我建议你看看Vavr。它有自己的函数式、不可变链表实现,它允许您在恒定时间内执行追加操作(不需要复制整个列表,因为公共元素是共享的)。例如:
var l1 = List.of(1, 2, 3); //List(1, 2, 3)
var l2 = l1.append(4); //List(1, 2, 3, 4)
在此示例中,两个列表将共享 1、2、3。
您还可以轻松地在 Java List 之间进行转换:
java.util.List<String> javaList = Arrays.asList("Java", "Haskell", "Scala");
List<String> vavrList = List.ofAll(javaList);
List<String> vavrStringList = List.of("JAVA", "Javascript", "Scala");
java.util.List<String> javaStringList = vavrStringList.toJavaList();
添加回答
举报