You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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();

逻辑说明:

  1. Optional.of(gameDto):用Optional包装传入的非nullgameDto(如果gameDto可能为null,需改用Optional.ofNullable())。
  2. map(gameplay::playRandomGame):调用playRandomGame方法转换得到新的GameDto,结果仍保存在Optional容器中。
  3. peek(dto -> repo.updateTotals(dto.getResult())):在不改变Optional中元素的前提下,执行更新统计的操作,peek适合这类带“副作用”的操作。
  4. get():取出处理后的GameDto(因为我们确定Optional中存在非null值,所以可以安全调用get())。

二、使用Stream.of()的实现

gameDto = Stream.of(gameDto)
                .map(gameplay::playRandomGame)
                .peek(dto -> repo.updateTotals(dto.getResult()))
                .findFirst()
                .get();

逻辑说明:

  1. Stream.of(gameDto):将单个gameDto包装成Stream流——Stream不仅能处理集合,也支持单个元素的链式操作。
  2. map和peek的作用和Optional版本完全一致,分别执行游戏逻辑和统计更新。
  3. findFirst():从流中获取唯一的元素,返回Optional<GameDto>。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:55:15