我有密码:
@GetMapping("/goal/{id}")
public String goalInfo(@PathVariable(value = "id") long id, Model model) {
if (!goalRepository.existsById(id)) {
return "redirect:/goal";
}
Iterable<SubGoal> subGoal = subGoalRepository.findAll();
ArrayList<SubGoal> subGoals = new ArrayList<>();
//How refactor this?
for(SubGoal sub : subGoal){
if(sub.getParentGoal().getId().equals(id)){
subGoals.add(sub);
}
}
if(subGoals.size() > 0) {
goalPercent(id, subGoal);
}
Optional<Goal> goal = goalRepository.findById(id);
ArrayList<Goal> result = new ArrayList<>();
goal.ifPresent(result::add);
model.addAttribute("goal", result);
model.addAttribute("subGoal",subGoals);
return "goal/goal-info";
}
在这里,我从存储库中获取子目标并过滤这些值。
没有foreach我怎么办?我想用溪流或者别的什么。
3条答案
按热度按时间aij0ehis1#
转换
Iterable
至Stream
使用StreamSupport.stream(iter.spliterator(), par)
.另外,这部分也可以是单语句。
前(三句话)
后(单语句)
更新
singletonList()
,emptyList()
这些只是创建单个实体列表和空列表时使用的工厂方法。你可以改变这部分的任何功能
Goal
作为输入和List
作为输出和任何空列表。例如,
2.我将列表类型改为
List<Goal>
,不是ArrayList<Goal>
对不起,我没听清楚。在oop中,在许多情况下,使用接口比使用具体类更好。
如果你必须使用
ArrayList<>
显式键入或出于某种原因要指定实际的列表示例,也可以使用toCollection()
就像下面一样。感谢@john bollinger@hfontanez指出这一点。
mklgxw1f2#
这是客户端过滤,效率极低。相反,只需在存储库接口上声明此方法:
gijlo24d3#
不需要在代码中声明iterable来过滤arraylist。filter方法已经为您提供了一个。您可以使用: