我正在尝试寻找最佳方法来优化以下转换器,以遵循我首先调用“ convertAndGroupForUpdate”的流程,该流程会触发转换和相关映射.
任何帮助优化此代码的方法将不胜感激.
public List<GroupedOrderActionUpdateEntity> convertAndGroupForUpdate(List<SimpleRatifiableAction> actions) {
List<GroupedOrderActionUpdateEntity> groupedActions = new ArrayList<>();
Map<String, List<SimpleRatifiableAction>> groupSimple = actions.stream()
.collect(Collectors.groupingBy(x -> x.getOrderNumber() + x.getActionType()));
groupSimple.entrySet().stream()
.map(x -> convertToUpdateGroup(x.getValue()))
.forEachOrdered(groupedActions::add);
return groupedActions;
}
public GroupedOrderActionUpdateEntity convertToUpdateGroup(List<SimpleRatifiableAction> actions) {
List<OrderActionUpdateEntity> actionList = actions.stream().map(x -> convertToUpdateEntity(x)).collect(Collectors.toList());
return new GroupedOrderActionUpdateEntity(
actions.get(0).getOrderNumber(),
OrderActionType.valueOf(actions.get(0).getActionType()),
actions.get(0).getSource(),
12345,
actions.stream().map(SimpleRatifiableAction::getNote)
.collect(Collectors.joining(", ", "Group Order Note: ", ".")),
actionList);
}
public OrderActionUpdateEntity convertToUpdateEntity(SimpleRatifiableAction action) {
return new OrderActionUpdateEntity(action.getId(), OrderActionState.valueOf(action.getState()));
}
解决方法:
您无法取消分组操作,但无需将中间结果存储在局部变量中.
此外,当您可以收集到列表时,不应手动添加到列表.就像在其他方法中一样进行操作.
同样,通过字符串连接创建分组键很诱人,但非常危险,根据属性的内容,生成的字符串可能会发生冲突.字符串连接是相当昂贵的.只要创建一个属性值列表,只要您不对其进行修改,它就会提供正确的相等语义和哈希码实现.
如果您只想处理地图的值,请不要调用entrySet()来通过getValue()映射每个条目.只需首先使用values()即可.
public List<GroupedOrderActionUpdateEntity> convertAndGroupForUpdate(
List<SimpleRatifiableAction> actions) {
return actions.stream()
.collect(Collectors.groupingBy( // use List.of(…, …) in Java 9 or newer
x -> Arrays.asList(x.getOrderNumber(), x.getActionType())))
.values().stream()
.map(x -> convertToUpdateGroup(x))
.collect(Collectors.toList());
}
由于convertToUpdateGroup多次处理每个组的动作列表,因此没有太多可以简化的地方,我也不会内联.如果只有一个操作,例如将它们连接到字符串,您可以在groupingBy操作中正确执行此操作,但是没有简单的方法可以收集多个结果.