Java 和函数式编程范式 - 如何使数组不可变

我正在尝试编写遵循函数式编程范式的代码,该范式非常虔诚地遵循不变性,但我知道如何使我的数组接近不可变的唯一方法是使用

List<Integer> items = Collections.unmodifiableList(Arrays.asList(0,1,2,3));

我不确定这是否使数组不可变或只是不可修改。如果上面的命令不能使数组不可变,那会怎样呢?


繁星淼淼
浏览 163回答 2
2回答

MMMHUHU

Arrays.asList除了通过反射之外,您无法改变底层数组(或 返回的列表)。然而,数组在这里并不真正相关。不要混淆数组和列表!从 Java 9 开始,List.of(0, 1, 2, 3)实现了相同的目标。要执行生成新集合的操作,您必须通过streams。您可能还想考虑第三方库,例如Guava(此链接指向其不可变集合页面)。或者甚至更好的PCollections,它只提供不可变的集合以及比 Guava 更实用的实现。

汪汪一只猫

使用的问题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();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java