我正在尝试迭代数据库表的存储库,一旦到达那里,访问其中一行以最终检索我需要的信息。 因此,我首先访问数据库中所有这些元素的存储库,应用
findAll()
方法;然后在那里我使用了stream().foreach(),它最终将我定位在每个项目中,能够检索任何类型的信息,例如访问其列表和其他内容。
但这会引发异常
Required type:Object
Provided:void
这是函数:
public ResponseEntity<Map<String, Object>> allshots(Authentication authentication) {
Map<String, Object> dto = new HashMap<>();
dto.put("player_shots_detail", playerCrabRepository.findAll().stream().forEach(playerCrab -> { playerCrab.getDiceCrabList().stream()
.map(diceCrab -> makeDiceCrabMiniDto(diceCrab)).collect(Collectors.toList());}));
return new ResponseEntity<>(dto, HttpStatus.CREATED);
}
这是否意味着我应该返回一些东西而不是 void ? 我感谢任何帮助,并提前致谢
forEach 返回 void 但 dto.put 需要一个对象。尝试用 map 替换 forEach
dto.put("player_shots_detail", playerCrabRepository.findAll().stream().map(playerCrab -> playerCrab.getDiceCrabList()).flatMap(diceCrab -> makeDiceCrabMiniDto(diceCrab)).collect(Collectors.toList()));
Stream 上的 forEach 哨兵操作不会返回任何内容,因为它的返回类型为 void。使用收集代替。你的 Map 需要一个对象作为值,而你的操作由于 forEach 而不会返回任何内容。
Java 文档供您参考。 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#forEach-java.util.function.Consumer-
错误表示您的函数类型为 void,您尝试将其响应作为值放置在映射中。
简而言之,foreach 块不返回任何内容。在这种情况下,您必须按以下方式存储响应。
当前代码是:
List<T> data = playerCrabRepository.findAll().stream()
.foreach(playerCrab -> {
playerCrab.getDiceCrabList.stream()
.map(makeDirceCrabMiniDto(diceCrab))
.collect(Collectors.toList())
})
dto.put("player_shots_detail", data);
使用map代替foreach并返回并收集它。
在这种情况下,您必须将结果存储在列表中,
List<T> data = playerCrabRepository.findAll().stream()
.map(playerCrab -> {
return playerCrab.getDiceCrabList.stream()
.map(makeDirceCrabMiniDto(diceCrab))
.collect(Collectors.toList())
}).collect(Collectors.toList());
dto.put("player_shots_detail", data);
java中
forEach
的返回类型是void。对于上述用例,您可以使用流的地图和平面地图功能。