如何用Optional.of()或Stream.of()精简Java代码?面试技术问询
用Optional.of()或Stream.of()精简指定Java代码的方案
针对你提到的两行代码:
gameDto = gameplay.playRandomGame(gameDto); repo.updateTotals(gameDto.getResult());
下面给出两种符合要求的精简实现,同时解释逻辑:
一、使用Optional.of()的实现
gameDto = Optional.of(gameDto) .map(gameplay::playRandomGame) .peek(dto -> repo.updateTotals(dto.getResult())) .get();
逻辑说明:
Optional.of(gameDto):用Optional包装传入的非nullgameDto(如果gameDto可能为null,需改用Optional.ofNullable())。map(gameplay::playRandomGame):调用playRandomGame方法转换得到新的GameDto,结果仍保存在Optional容器中。peek(dto -> repo.updateTotals(dto.getResult())):在不改变Optional中元素的前提下,执行更新统计的操作,peek适合这类带“副作用”的操作。get():取出处理后的GameDto(因为我们确定Optional中存在非null值,所以可以安全调用get())。
二、使用Stream.of()的实现
gameDto = Stream.of(gameDto) .map(gameplay::playRandomGame) .peek(dto -> repo.updateTotals(dto.getResult())) .findFirst() .get();
逻辑说明:
Stream.of(gameDto):将单个gameDto包装成Stream流——Stream不仅能处理集合,也支持单个元素的链式操作。map和peek的作用和Optional版本完全一致,分别执行游戏逻辑和统计更新。findFirst():从流中获取唯一的元素,返回Optional<GameDto>。get():取出最终的GameDto对象。
修改后的完整方法示例(以Optional版本为例)
@Service("gameService") public class GameServiceImpl implements GameService{ @Autowired private SessionInMemoryRegistry sessionRegistry; @Autowired private GameInMemoryRepo repo; @Autowired private GamePlay gameplay; @Override public ResponseDto addGameToSession(GameDto gameDto) { gameDto = Optional.of(gameDto) .map(gameplay::playRandomGame) .peek(dto -> repo.updateTotals(dto.getResult())) .get(); return sessionRegistry.addGameSession(gameDto.getSessionId(), gameDto.getPlayer1Choice(), gameDto.getPlayer2Choice(), gameDto.getResult()); } }
注意事项
- 上述两种实现的前提是
playRandomGame方法不会返回null,否则get()会抛出NoSuchElementException。如果存在返回null的可能,建议用orElse()或orElseThrow()做兜底处理,比如orElseThrow(() -> new IllegalArgumentException("GameDto cannot be null"))。 - 代码精简的同时要兼顾可读性,原始代码的分步写法其实更直观,面试官考察的是你对Optional和Stream在非集合场景下的用法掌握,实际开发中需结合团队规范选择合适的写法。
内容的提问来源于stack exchange,提问作者r.lally91
相关产品推荐
相关产品推荐

