【问题标题】:Best way to replace multiple FOR loops with stream api in Java在 Java 中用流 api 替换多个 FOR 循环的最佳方法
【发布时间】:2020-12-04 06:26:25
【问题描述】:

我想让这个函数运行的时间更少。我假设stream() 可能会有所帮助。但不确定如何。

private List<TodayMenu> getRecommendedTodayMenuItems(Map<String, Integer> itemsGroupedDailySales, List<TodayMenu> itemsOnTodayMenu) {

    List<TodayMenu> recommendedTodayMenu = new ArrayList<>();

    for (Map.Entry<String,Integer> itemGroupedDailySales : itemsGroupedDailySales.entrySet()) {
        for (TodayMenu todayMenu : itemsOnTodayMenu) {
            if (todayMenu.getMenuId().equals(itemGroupedDailySales.getKey())) {
                recommendedTodayMenu.add(todayMenu);
                break;
            }
        }
        if (recommendedTodayMenu.size() >= 9) {
            return recommendedTodayMenu;
        }
    }
    return recommendedTodayMenu;
}

【问题讨论】:

    标签: java performance loops java-stream


    【解决方案1】:

    结果仅包含 itemsOnTodayMenu 的记录,因此您可以开始迭代此列表并在 itemsGroupedDailySales 中执行查找(HashMap 在这方面很好)。

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    private List<TodayMenu> getRecommendedTodayMenuItemsBetter(Map<String, Integer> itemsGroupedDailySales,
            List<TodayMenu> itemsOnTodayMenu) {
        return itemsOnTodayMenu.stream()
            .filter((tm)->itemsGroupedDailySales.containsKey(tm.getMenuId()))
            .limit(9)
            .collect(Collectors.toList());
    }
    

    备注:您不使用 itemsGroupedDailySales 的值。您的逻辑在前 9 个匹配项后停止,但没有定义顺序。例如,不是按推荐选择的销量最高的产品。我希望你知道这一点。

    【讨论】:

      【解决方案2】:

      您应该在地图中按 id 索引您的 itemsOnTodayMenu。您可以将时间从 O(n*m) 节省到 O(n+m)。

      • 迭代 itemsOnTodayMenu 以构建地图
      • 迭代项目GroupedDailySales
        • 通过地图上的 id 获取今日菜单

      【讨论】:

        【解决方案3】:

        你打算从外循环中最多找到内循环中的单个元素。因此,您需要在主结构上使用map,使用filter 检查您拥有的等号并调用findFirst 以使用初始代码的break 实现行为。要limit的结果数,调用同名方法。

        我会为此编写一些代码,但我对 Java 流没有经验,也没有办法测试我要编写的任何代码。所以,请尝试实施这个想法,并确保告诉我它是如何进行的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-13
          • 1970-01-01
          • 2020-10-04
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          • 2015-08-03
          • 1970-01-01
          相关资源
          最近更新 更多