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

Java 8-带有对象和原始包装器的流

乌俊健
2023-03-14

我正在使用Java 8流,并试图修改forEach终端操作中的对象内容。

我在这里面临的问题是,我可以修改列表 对象内容,但不能修改列表 的内容

代码片段如下:

public static void streamExample() {

    List<Employee> listEmp = Arrays.asList(new Employee());
    listEmp.stream().forEach(a -> a.setEmptName("John Doe"));
    listEmp.stream().forEach(System.out::println);
    List<Integer> listInteger = Arrays.asList(2, 4, 6, 8, 12,17, 1234);
    listInteger.stream().filter(v -> v % 2 == 0).forEach(a -> a=a+1);
    listInteger.stream().forEach(System.out::println);

}

我想知道,由于在执行a=a+1操作时取消了整数对象的装箱,所以该更改不会反映在列表中,但不确定。

共有1个答案

澹台星剑
2023-03-14

您使用的stream不是最佳方法。请将stream中的每个步骤都看作修改已存在的(或创建新的)元素并将其返回到stream。最后,您将收到final结果,您可以使用final方法之一来完成(并实际运行整个流工作):

List<Integer> listInteger = Arrays.asList(2, 4, 6, 8, 12, 17, 1234);
listInteger.stream().filter(v -> v % 2 == 0).forEach(a -> a = a + 1);
listInteger.stream().forEach(System.out::println);

这里有初始数组。您希望执行以下操作:

  1. 筛选出某些元素(这不是最终步骤);
  2. 打印筛选出的元素(这是最终步骤)。

为此,不必创建两次。请使用一个:

Stream.of(2, 4, 6, 8, 12, 17, 1234)    // create stream (there're many way to do it)
      .filter(v -> v % 2 == 0)         // filter out required elements
      .map(v -> v + 1)                 // transform elements using given rule
      .forEach(System.out::println);   // finalize stream with printing out each element separately

注意:stream.of(...)创建一个,然后我们向流筛选映射添加两个步骤,然后finalize或使用foreach启动创建的流。

 类似资料:
  • 两者的计算结果都为false。(顺便说一句,比较是不必要的,因为类不会重写Object中的equals。) 和都是,因为它们可比,没有错误。比较两个具有不同声明的泛型类型的对象是非法的。 在进一步检查时,字段将通过调用包私有的本机方法,如下所示: 除了Java文档对“表示基元类型”的模糊暗示之外,我找不到任何关于这方面的文档。这个领域有什么用处吗?它在包装类本身中没有使用。 (编辑) 是真的。 还

  • 从 BaseX 服务器执行的 X 查询中,我得到这样的结果: 我需要用JAXB将这个结果转换成Protocollo对象的列表,以便用JList显示它们。因此,在这里的一次讨论之后,我声明了下面的类: 和 最后,我这样执行对话: 我不断得到这个例外: 我想我在注释方面犯了一些错误。你能帮忙吗?

  • 包装对象 定义 包装对象的构造函数 包装对象实例的方法 原始类型的自动转换 自定义方法 Boolean对象 概述 Boolean实例对象的布尔值 Boolean函数的类型转换作用 包装对象 定义 在JavaScript中,“一切皆对象”,数组和函数本质上都是对象,就连三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。 所谓“包装对象”,就是分

  • 问题内容: 我一直在研究各种hibernate教程和示例,因为它们具有标识/主键属性,有些使用Java基本类型,有些使用包装器类型。 与 为什么以及何时将一个用作实体密钥? 问题答案: 从Hibernate的角度来看,它没有任何改变,因为Hibernate使用相同的Hibernate类型来表示它们。 然而,正如字节码忍者指出,你不能区分原始INT的默认值从分配的同时也有可能没有歧义(一个ID总是意

  • 我试图了解Java原语和包装器是如何工作的。让我们考虑以下示例。 由于整数是不可变的和非原语,语句将编译为以下内容 这将创建大约10000个整数对象(每次调用新)和将整数拆箱为int的成本。 我说的对吗?

  • 定义 对象是 JavaScript 语言最主要的数据类型,三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”(wrapper)。 所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。 var v1 = new Number(123)