面试问题-如何使用Optional.of()或Stream.of(()来减少代码



我最近进入了最后一轮面试。

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

摘要

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

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

一点上下文的总体片段:

@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());
}
}

首先,这段代码很可疑:字段上的@Autowired,重新分配了方法参数。

如果你问我的意见,这段代码既不需要Streams,也不需要Optional(因为没有返回一个的方法(。您似乎被要求以一种模糊的方式重写代码,这样它就会滥用可选或流。

行数是而不是代码质量的度量。

这里有一个滥用流的例子:

@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文档。

这里有一个可选滥用的例子(在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的用法,请参阅Java和OpenJDK开发人员Stuart Marks的回答。

最新更新