地图上的流不会保存.map更改

Man*_*el 1 java dictionary java-stream

有人可以解释一下为什么第一个代码示例没有保存我在地图上用.map所做的更改,但第二个代码示例呢?

第一个代码示例:

stringIntegerMap.entrySet().stream()
            .map(element -> element.setValue(100));
Run Code Online (Sandbox Code Playgroud)

第二个代码示例:

        stringIntegerMap.entrySet().stream()
            .map(element -> element.setValue(100))
            .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

另外,为什么第二个代码示例只打印值而不是整个元素(键+值)?

Men*_*ena 7

您的流操作是惰性评估的.

如果您不调用诸如forEach(或collect等)之类的终端操作,则实际上不会发生流式传输,因此您setValue不会执行.

请注意,通常建议您修改正在流式传输的集合/地图.

最后,API Map.Entry#setValue在这里.您会注意到该方法返回:

与条目对应的旧值

因此,在执行映射操作时,生成的流包含值.

这里的一些来源(搜索"流操作和流水线",以及关于"非干扰"的部分可能会有所帮助).

  • OP显然想要实现的是完全没有Stream API:`stringIntegerMap.replaceAll((k,v) - > 100); .stringIntegerMap.entrySet()的forEach(的System.out ::的println);` (3认同)