ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-25 09:01:12  阅读:161  来源: 互联网

标签:java-8 java-stream loops optimization java


我正在尝试寻找最佳方法来优化以下转换器,以遵循我首先调用“ 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-8,java-stream,loops,optimization,java
来源: https://codeday.me/bug/20191025/1927431.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有