用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;
}

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

您应该根据映射中的id为itemsOnTodayMenu编制索引。您可以节省从O(n*m(到O(n+m(的时间。

  • 迭代项目OnTodayMenu以构建映射
  • 迭代项目GroupedDailySales
    • 通过id从地图中获取今日菜单

您打算从外循环中最多在内循环中找到一个元素。因此,您需要在主结构上进行映射,使用filter检查您拥有的equals,并调用findFirst以使用初始代码的break实现行为。若要限制结果的数量,请调用具有相同名称的方法。

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

相关内容

  • 没有找到相关文章