Pet*_*zov 4 java for-loop java-8 java-stream
我想通过内部搜索实现此端点:
@PostMapping("terminals_risk_filter/change_order/{terminalId}")
public ResponseEntity<?> updateFiltersPositions(@PathVariable Integer terminalId,
@RequestBody List<ChangeOrderRiskFiltersDTO> newFiltersPositionsList) {
List<RiskFilters> filterList = riskFilterService.findRiskFiltersByTerminalId(terminalId);
for (int i = 0; i < newFiltersPositionsList.size(); i++) {
// RiskFilters filter = filterList.findById(newFiltersPositionsList.get(i).getId());
Optional<RiskFilters> filter_payload = filterList.stream().filter(f -> newFiltersPositionsList.get(i).getId() == f.getId()).findAny();
RiskFilters filter = filter_payload.get();
filter.setPosition(newFiltersPositionsList.get(i).getPosition());
riskFilterService.save(filter);
}
return ok().build();
}
Run Code Online (Sandbox Code Playgroud)
但是我收到错误消息,Local variable i defined in an enclosing scope must be final or effectively final能否请您给我一些建议,以解决此问题?例如,我可以跳过for循环并使用流到流吗?
请给我一些建议,以解决此问题。
为什么会这样?您可以在此处阅读有关内容:Lambdas:局部变量需要最终变量,实例变量不需要
最小的更改即可解决您的问题:请勿使用i变量本身。创建它的副本并制作它final。
final int iCopy = i;
Optional<RiskFilters> filter_payload = filterList.stream().filter(f -> newFiltersPositionsList.get(iCopy).getId() == f.getId()).findAny();
Run Code Online (Sandbox Code Playgroud)
例如,我可以跳过for循环并在流中使用流吗?
您可以尝试一下:
// replace the for-loop
// or just.... `newFiltersPositionsList.forEach(/* ... */)`
newFiltersPositionsList.stream().forEach(filterPosition -> {
Optional<RiskFilters> filter_payload = filterList.stream()
.filter(f -> filterPosition.getId() == f.getId())
.findAny();
RiskFilters filter = filter_payload.get();
filter.setPosition(filterPosition.getPosition());
riskFilterService.save(filter);
});
Run Code Online (Sandbox Code Playgroud)
另外,您可以使用for-each而不是for-loop:
for (ChangeOrderRiskFiltersDTO filterPosition : newFiltersPositionsList) {
Optional<RiskFilters> filter_payload = filterList.stream()
.filter(f -> filterPosition.getId() == f.getId())
.findAny();
RiskFilters filter = filter_payload.get();
filter.setPosition(filterPosition.getPosition());
riskFilterService.save(filter);
}
Run Code Online (Sandbox Code Playgroud)