java - 将多个流优化为单个循环

标签 java loops optimization java-8 java-stream

我正在尝试找到优化下面转换器的最佳方法,以遵循我首先调用“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 操作中执行此操作,但没有简单的方法来收集多个结果。

关于java - 将多个流优化为单个循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49427757/

相关文章:

Java 正则表达式验证特殊字符

java - 是否值得将 QuickFix 从 Mina 迁移到 Netty?

java - 为什么我的 stub 方法返回 null?

javascript - 构造函数内的循环有什么问题? [JS]

r - 在 R 包 fPortfolio 中设置目标风险

c++ - 编译优化问题

java - 生成一个介于 1 和 2 之间的数字 java Math.random()

algorithm - 算法的平均复杂度

c - C编程中删除空格错误

python - 使用 GEKKO 优化框架形成约束方程系统