【问题标题】:Interview question - How to use Optional.of() or Stream.of() to reduce code面试题——如何使用Optional.of()或Stream.of()来减少代码
【发布时间】:2022-11-25 05:38:05
【问题描述】:

我最近通过了最后一轮面试。

在面试的某个时刻,他们要求我在下面的一段代码中展示我的 Java 8 知识。他们要求我使用Optional.of()Stream.of() 来减少以下代码。而且我完全被冻结了,我只在列表中使用过流并且不知道如何使用可选方法。因为他们说我对java8的理解不够好,所以我没有得到这份工作。有人可以告诉我他们在找什么吗?

概括

我被特别要求用 Optional.of()Stream.of() 减少这些 2 行:

gameDto = gameplay.playRandomGame(gameDto);
repo.updateTotals(gameDto.getResult());

总体 sn-p 的一些上下文:

@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 = gameplay.playRandomGame(gameDto);
        repo.updateTotals(gameDto.getResult());
        return sessionRegistry.addGameSession(gameDto.getSessionId(), gameDto.getPlayer1Choice(), gameDto.getPlayer2Choice(), gameDto.getResult());
    }
}

【问题讨论】:

    标签: java lambda java-stream option-type


    【解决方案1】:

    首先,这段代码有问题:@Autowired 在字段上,重新分配了方法参数。

    如果你问我的意见,这段代码既不需要 Streams,也不需要 Optional(因为不涉及返回一个的方法)。看起来你被要求以一种模糊的方式重写代码,这样它就可以虐待Optional 或 Stream。

    行数是不是代码质量的指标。

    这是流滥用的示例:

    @Override
    public ResponseDto addGameToSession(GameDto gameDto) {
        
        Stream.of(gameDto)
            .map(gameplay::playRandomGame)
            .forEach(gDto -> repo.updateTotals(gDto.getResult()));
        
        return sessionRegistry.addGameSession(gameDto.getSessionId(), gameDto.getPlayer1Choice(), gameDto.getPlayer2Choice(), gameDto.getResult());
    }
    

    上面的代码不必要地通过副作用,被贬低为Stream API documentation

    这是一个可选滥用的例子(Optional.ofNullable() 可以更频繁地观察到):

    @Override
    public ResponseDto addGameToSession(GameDto gameDto) {
        
        Optional.of(gameDto)
            .map(gameplay::playRandomGame)
            .ifPresent(gDto -> repo.updateTotals(gDto.getResult()));
        
        return sessionRegistry.addGameSession(gameDto.getSessionId(), gameDto.getPlayer1Choice(), gameDto.getPlayer2Choice(), gameDto.getResult());
    }
    

    简而言之,Optional 是一个数据容器,旨在表示一个返回类型.您可以将它包装在可为 null 的东西周围,这样就可以安全地与方法调用的结果进行交互,而不管它是否包含实际值。

    只在其上的顺序链方法中创建一个 Optional,这违背了它的设计目标。这是一种气味,应该避免。

    关于 Optional 的用法,请参阅 @Stuart Marks Java 和 OpenJDK 开发人员的 thisthis 回答。

    【讨论】:

    • 第二个例子应该是Optional.of,我同意这只是一个“你知道如何.map”的问题
    • 你是对的,他们并不是在暗示这段代码是流/可选的很好的候选者,他们只是在看我是否知道如何去做(我不知道!)。所以感谢一百万人向我展示了他们想要的东西!
    • @r.lally91 我认为这可能是一种“双底”问题。面试官可能不仅想了解您是否熟悉 Java 的函数式编程特性,而且还想测试您评估您刚刚编写的代码的能力。
    • 撇开这是以一种无意的方式使用 API 不谈,面试官的任务是“减少这两行” 如果我们把这一行弄得很长,这个结果只会是一行。这并不是说我们也不能在一行中写出原始的gameDto = gameplay.playRandomGame(gameDto); repo.updateTotals(gameDto .getResult());;它甚至更短。我们甚至可以把它写成一个陈述如果该句法特性是目标:repo.updateTotals((gameDto = gameplay.playRandomGame( gameDto)).getResult());(如果获得有问题的代码是实际目标,它甚至可以工作)。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多