Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从映射到映射的Java流:在流时更改对象内部的值_Java_Java Stream - Fatal编程技术网

从映射到映射的Java流:在流时更改对象内部的值

从映射到映射的Java流:在流时更改对象内部的值,java,java-stream,Java,Java Stream,我定义了一个映射,并用矩形类型的5个对象填充它。每个矩形对象都有属性rectangleId、aLength、bLength和color 我想使用java流api将给定的映射流化到新映射中。流动时,所有红色矩形的bLength值应增加100。下面是我到目前为止得到的。我似乎不知道如何更改bLength的值 如果要在新贴图中包含原始贴图中的所有矩形,并修改其中的一些矩形,则不能使用过滤器方法,因为这样会将结果限制为仅显示红色的矩形 流式处理时,需要使用贴图方法更改矩形: Map<Integer

我定义了一个映射,并用矩形类型的5个对象填充它。每个矩形对象都有属性rectangleId、aLength、bLength和color

我想使用java流api将给定的映射流化到新映射中。流动时,所有红色矩形的bLength值应增加100。下面是我到目前为止得到的。我似乎不知道如何更改bLength的值


如果要在新贴图中包含原始贴图中的所有矩形,并修改其中的一些矩形,则不能使用过滤器方法,因为这样会将结果限制为仅显示红色的矩形

流式处理时,需要使用贴图方法更改矩形:

Map<Integer, Rectangle> myMapNew = myMap.entrySet().stream()
                .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue().increaseBLengthOrReturnIdentity()))
                .collect(Collectors.toMap(r -> r.getKey(), r -> r.getValue()));

如果要在新贴图中包含原始贴图中的所有矩形,并修改其中的一些矩形,则不能使用过滤器方法,因为这样会将结果限制为仅显示红色的矩形

流式处理时,需要使用贴图方法更改矩形:

Map<Integer, Rectangle> myMapNew = myMap.entrySet().stream()
                .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue().increaseBLengthOrReturnIdentity()))
                .collect(Collectors.toMap(r -> r.getKey(), r -> r.getValue()));
通过修改矩形,仍然只有每个矩形的一个实例,因此两个贴图中的矩形都是相同的矩形,因此在建议的操作后,新贴图将与旧贴图相同。因此,不需要新地图-修改旧地图就足够了:

myMap.values().stream()
  .filter(r -> r.color.equals("red"))
  .forEach(r -> r.length += 100);
要使新映射不同,您需要为néw映射创建新的矩形实例,但这不是您所建议的

还要注意,在一般情况下,使用==比较字符串不能保证按照预期的方式工作;始终使用.equals.

通过修改矩形,每个矩形仍然只有一个实例,因此两个贴图中的矩形都是相同的矩形,因此在建议的操作后,新贴图将与旧贴图相同。因此,不需要新地图-修改旧地图就足够了:

myMap.values().stream()
  .filter(r -> r.color.equals("red"))
  .forEach(r -> r.length += 100);
要使新映射不同,您需要为néw映射创建新的矩形实例,但这不是您所建议的


还要注意,在一般情况下,使用==比较字符串不能保证按照预期的方式工作;始终使用.equals.

因此,在流媒体中有两个步骤:

传入矩形到传出矩形=标识 基于谓词转换矩形的一个或多个属性=条件属性修改 用函数求解 不管怎样,实际上在流媒体中淘汰了这一步骤: Function toIdentical=Function.identity; 修改规则: 所有属性颜色为红色的矩形的稠度应增加100

函数toConditialModified=矩形->{ 如果rectangle.color.equalsred{//conditional rectangle.bLength+=100;//修改 } 返回矩形; }; 然后合并成一条小溪 使用以下功能步骤构建管道:

映射newRectanglesMap=oldRectanglesMap.values.stream .map to dential//可以省略此选项 .映射到条件已修改 .collectors.toMapr->r.rectangleId,r->r; 或者:部分更新 只需处理这些值,如有必要,可进行修改:

oldRectanglesMap.values.stream .filterr->r.color.equalsred//仅获取红色的 .forEachr->{r.bLength+=100;}//修改已筛选的 过度可读&功能分解 如果将函数分解为前面步骤2的条件修改,则可读性更好:

谓词isRed=r->r.color.equalsred; 消费者更新长度plus100=r->r.bLength+=100; oldRectanglesMap.values.stream .过滤器isRed .forEach UpdateLength plus100; 我刚刚使用了您的代码和要求:

从不同方面看问题 以不同的方式分解它 以不同的方式解决这些部分 但是:始终使用流
因此,您的流媒体有两个步骤:

传入矩形到传出矩形=标识 基于谓词转换矩形的一个或多个属性=条件属性修改 用函数求解 不管怎样,实际上在流媒体中淘汰了这一步骤: Function toIdentical=Function.identity; 修改规则: 所有属性颜色为红色的矩形的稠度应增加100

函数toConditialModified=矩形->{ 如果rectangle.color.equalsred{//conditional rectangle.bLength+=100;//修改 } 返回矩形; }; 然后合并成一条小溪 使用以下功能步骤构建管道:

映射newRectanglesMap=oldRectanglesMap.values.stream .map to dential//可以省略此选项 .映射到条件已修改 .collectors.toMapr->r.rectangleId,r->r; 或者:部分更新 只需处理这些值,如有必要,可进行修改:

oldRectanglesMap.values.stream .filterr->r.color.equalsred//仅获取红色的 .forEachr->{r.bLength+=100;}//修改已筛选的 过度可读&功能分解 如果分解Functi,则可读性更好 在进行上一步骤2的初始修改时:

谓词isRed=r->r.color.equalsred; 消费者更新长度plus100=r->r.bLength+=100; oldRectanglesMap.values.stream .过滤器isRed .forEach UpdateLength plus100; 我刚刚使用了您的代码和要求:

从不同方面看问题 以不同的方式分解它 以不同的方式解决这些部分 但是:始终使用流
谢谢,但是我得到了以下错误:必需类型:函数对不起,我错过了您在Map.Entry对象而不是仅矩形对象上进行流式处理。我更新了答案并进行了测试。现在它应该可以工作了。谢谢,但是我得到了以下错误:必需类型:函数抱歉,我错过了您在Map.Entry对象上进行流式处理,而不是仅在矩形对象上进行流式处理。我更新了答案并进行了测试。现在它应该可以工作了。为什么要使用流api?在for循环中似乎很简单。结果必须是一个新的映射吗?通过修改矩形,每个矩形只有一个实例,因此在建议的操作后,新贴图将与旧贴图相同。要使这两个贴图不同,您需要为新贴图创建新的矩形实例。请详细说明。为什么要使用流api?在for循环中似乎很简单。结果必须是一个新的映射吗?通过修改矩形,每个矩形只有一个实例,因此在建议的操作后,新贴图将与旧贴图相同。要使这两个贴图不同,您需要为新贴图创建新的矩形实例。请详细说明。