从映射到映射的Java流:在流时更改对象内部的值
我定义了一个映射,并用矩形类型的5个对象填充它。每个矩形对象都有属性rectangleId、aLength、bLength和color 我想使用java流api将给定的映射流化到新映射中。流动时,所有红色矩形的bLength值应增加100。下面是我到目前为止得到的。我似乎不知道如何更改bLength的值从映射到映射的Java流:在流时更改对象内部的值,java,java-stream,Java,Java Stream,我定义了一个映射,并用矩形类型的5个对象填充它。每个矩形对象都有属性rectangleId、aLength、bLength和color 我想使用java流api将给定的映射流化到新映射中。流动时,所有红色矩形的bLength值应增加100。下面是我到目前为止得到的。我似乎不知道如何更改bLength的值 如果要在新贴图中包含原始贴图中的所有矩形,并修改其中的一些矩形,则不能使用过滤器方法,因为这样会将结果限制为仅显示红色的矩形 流式处理时,需要使用贴图方法更改矩形: Map<Integer
如果要在新贴图中包含原始贴图中的所有矩形,并修改其中的一些矩形,则不能使用过滤器方法,因为这样会将结果限制为仅显示红色的矩形 流式处理时,需要使用贴图方法更改矩形:
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循环中似乎很简单。结果必须是一个新的映射吗?通过修改矩形,每个矩形只有一个实例,因此在建议的操作后,新贴图将与旧贴图相同。要使这两个贴图不同,您需要为新贴图创建新的矩形实例。请详细说明。