当前位置: 首页 > 知识库问答 >
问题:

Java8流是不可变的吗?

邰德业
2023-03-14

如果我的API提供了一个流,客户端是否有办法修改基础集合?

例如:

class ListWrapper {
  List<String> myList;
  ...
  Stream<String> getStream() {
    return myList.stream();
  }
}

客户端是否可以调用listWrapper.getStream()并以某种方式修改myList的内容?

共有1个答案

陈修诚
2023-03-14

流不能修改基础集合(如果集合本身没有公开),因此不能添加或删除元素,也不能更改顺序。当您在终端操作中使用流时,将生成一个新集合(但您可以将其收集到另一个现有集合中)。

但是,如果元素本身是可变的,流操作仍然可以修改单个元素。这是不好的做法,但可以做到。

例子:

class Item { public int x; public Item(int x) { this.x = x; } }
var list = List.of(new Item(1), new Item(2));
list.stream().peek(item -> item.x = 3).collect(toList());

当使用collect(或countforEach或任何其他终端操作)使用流时,peek回调将修改每个元素。运行上述代码后,您的列表将包含两个值为x=3的项目peek是一种任意选择的非终端操作。使用过滤器映射/平面映射或任何其他非终端操作都可以观察到相同的行为。

从精神上讲,这非常类似于:Java是“按引用传递”还是“按值传递”?,但至少更好的隐藏。

 类似资料:
  • 只是在列表下面迭代 以上三个迭代有什么区别

  • 我正在解析输入JSON。对于一个字段,有3种可能: 字段不存在; 该值设置为NULL; 该值设置为有效值。 null

  • 问题内容: 我知道这可能很愚蠢,但是很多地方都声称Java中的Integer类是不可变的,但是下面的代码: 毫无困难地执行(给出预期的结果)6。因此有效地改变了a的值。这不是说Integer是可变的吗?第二个问题和一些小问题:“不变的类不需要复制构造函数”。有人在乎解释原因吗? 问题答案: 不可变并不意味着永远不能等于另一个值。例如,也是不可变的,但是我仍然可以这样做: 并没有改变,而是变成了一个

  • PS:你能用Java8为Android 7.0及更高版本和Java7为更低版本做同样的apk吗?

  • 我正在寻找一种方法来调用多个参数方法,但是使用构造。文档中说只有在能够映射到功能接口时才可用。 基本上,如上所述,考虑使用中不同数量的属性的方法。

  • Java字符串是Java中特殊的 Java中字符串的不可变性 > 不变性:现在,根据不变性,String类已经被设计成可以在其他地方/变量中重用公共池中的值。如果创建为 但是,如果我创建类似 这些上面已经有帖子了吗?如果是,有人可以分享链接吗?