java - 使用流修改 map

标签 java lambda java-8 java-stream

我有一个 map ,我正在迭代它并使用 for 循环修改 map 的值。我想知道是否有办法使用 Java 8 流来做到这一点。

这是我的代码:

Map<String,MyObject> myMap = getResultMap();
for (Map.Entry<String, MyObject> entry : myMap.entrySet()) {
    entry.getValue.setName(getName());
    entry.getValue.setId(getId());
    entry.getValue.setDept(getDept());
    entry.getValue.isValid(isValid();
    entry.getValue.setPipeLine(getPipeLine());
}

基本上,我想流式传输 map 值并设置值并将其作为新 map 获取。

最佳答案

您可以获得一个新的 Stream或作为流操作的结果生成一个新的 Map,但 Stream 无法改变数据(但您可以创建一个 lambda 来执行您想要的任何操作)。例如,使用您的代码示例:

Map<String, MyObject> myMap = getResultMap();
Map<String, MyObject> newMap = myMap.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey, entry ->
            {
                entry.getValue().setName(getName());
                entry.getValue().setId(getId());
                entry.getValue().setDept(getDept());
                entry.getValue().setValid(isValid());
                entry.getValue().setPipeLine(getPipeLine());
                return entry.getValue();
            }
            ));

但是不要更新Stream内的共享可变变量!它会产生很多问题。

最好创建 MyObject 类的新实例,而不是修改 myMap:

Map<String, MyObject> newMap = myMap.entrySet().stream()
                .collect(Collectors.toMap(Map.Entry::getKey, entry ->
                        {
                            MyObject myObject = new MyObject();
                            myObject.setName(getName());
                            myObject.setId(getId());
                            myObject.setDept(getDept());
                            myObject.setValid(isValid();
                            myObject.setPipeLine(getPipeLine());
                            return myObject;
                        }
                ));

关于java - 使用流修改 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57599018/

相关文章:

java - 如何在java中优化素数生成器?

java - Android:VerticalGridFragment 在使用 ErrorFragment 时导致应用程序崩溃?

java - DateFormat可在 native JUnit测试中使用,但不会由Gradle执行

java - 如何在功能接口(interface)/lambda 调用中传递 Object 对象

c# - 如何在 C# 表达式树中设置字段值?

java - 非捕获 lambda 似乎仍然捕获了封闭的实例

java - 带有 Java 8 lambdas 和 Optional 的子类

java - Java 8 中的条件 lambda 执行

java 8流从类型A的集合创建类型B的集合

java - 输入流和输入流读取器