首页 > 解决方案 > 在 Java 中用流 api 替换多个 FOR 循环的最佳方法

问题描述

我想让这个功能运行的时间更少。我假设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;
}

标签: javaperformanceloopsjava-stream

解决方案


结果仅包含 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 个匹配项后停止,但没有定义顺序。例如,不是按推荐选择的销量最高的产品。我希望你知道这一点。


推荐阅读