为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星淼淼 2023-08-23 17:07:29
我正在尝试编写遵循函数式编程范式的代码,该范式非常虔诚地遵循不变性,但我知道如何使我的数组接近不可变的唯一方法是使用List<Integer> items = Collections.unmodifiableList(Arrays.asList(0,1,2,3));我不确定这是否使数组不可变或只是不可修改。如果上面的命令不能使数组不可变,那会怎样呢?
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

  1. Arrays.asList除了通过反射之外,您无法改变底层数组(或 返回的列表)。然而,数组在这里并不真正相关。不要混淆数组和列表!

  2. 从 Java 9 开始,List.of(0, 1, 2, 3)实现了相同的目标。

  3. 要执行生成新集合的操作,您必须通过streams。您可能还想考虑第三方库,例如Guava(此链接指向其不可变集合页面)。或者甚至更好的PCollections,它只提供不可变的集合以及比 Guava 更实用的实现。


查看完整回答
反对 回复 2023-08-23
?
汪汪一只猫

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();


查看完整回答
反对 回复 2023-08-23
  • 2 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信