Optional Java 8中引入的类型对于许多开发人员来说是一件新事物.
一个getter方法返回Optional<Foo>类型代替经典的Foo一个好习惯吗?假设值可以null.
在获取流之前进行空检查的最佳/惯用方法是什么?
我有接收List可能为null的方法.所以我不能只调用.stream()传入的值.是否有一些静态助手,如果值为null,会给我一个空流?
Java 8 中引入的类型Optional<T>主要推荐用于返回类型和结果。因此,每当我在类字段或方法参数中使用它时,我都会在 IntelliJ 中收到警告:
Optional<?>用作字段/参数的类型。
Optional<T>但是,当我在规范构造函数中使用 an 作为记录参数时,我没有收到此警告:
public record AuthenticationResult(
boolean isAuthenticated,
Optional<User> user,
Optional<String> authorizationHeader)
{ }
Run Code Online (Sandbox Code Playgroud)
不使用类型作为参数/字段的做法是否Optional<T>不适用于记录参数,因为字段将始终作为记录自动生成的 getter 方法的返回值进行访问?
或者是因为记录是一项新功能,并且此警告尚未实现,并且在记录中使用可选参数与用作方法参数或字段时具有相同的后果?
首先我知道这两种方法的区别。
Optional.of:用于保证不存在null,如果输入null,则nullPointException
Optional.ofNullable: 可能为空,也可能不为空。用来灵活应对。
那么,如果我加上orElseThrow(() -> new NullPointerException("null data"))这个,结果会是一样的吗?
我想抛出带有显式内容的错误。
所以我得到Optional.ofNullable(data).orElseThrow(() -> new NullPointerException("null data")))
将其用作这是无意义的行为吗?
Optional.of(data).orElseThrow(() -> new NullPointerException("null data")))
我认为这也是可能的,但我只是用来ofNullable()使代码看起来一致。
总结一下,到底如果加上的话结果还是一样orElseThrow(nullPoint)
吗of?ofNullable
那么反而of.orElseThrow更好呢?
如何使用 Java 8 Lambdas 执行此操作:
Optional<String> code;
if (accountType.requiresCode() && (!code.isPresent() || empty(code.get()))) {
new IllegalArgumentException("Account type " + accountType + " requires code");
}
Run Code Online (Sandbox Code Playgroud) 这可能是一个愚蠢的问题。
当我Optional.isEmpty()在代码中使用如下所示时
Optional<List<String>> optional = Optional.of(new ArrayList<>());
optional.isEmpty(); // only checks if the value is NULL or not.
Run Code Online (Sandbox Code Playgroud)
isEmpty()方法只是检查值null是否存在。
public boolean isEmpty() {
return value == null;
}
Run Code Online (Sandbox Code Playgroud)
这个方法名称对我来说似乎不太清楚。
我想知道为什么这个方法被命名isEmpty(),而不是isNull()因为它在幕后执行空检查?
假设我有一个Optional包含Stream:
Optional<Stream<Integer>> optionalStream = Optional.of(Stream.of(1, 2, 3));
Run Code Online (Sandbox Code Playgroud)
现在我需要提取它Stream本身。如果Optional为空,您想要获得一个空的 Stream。
我正在寻找类似的东西,flatStream()可以一步执行转换。我怎样才能做到这一点?
我目前的尝试:
Stream<Integer> stream = optionalStream.stream().flatMap(Function.identity());
Run Code Online (Sandbox Code Playgroud)
在我的真实场景中,我有这样的东西,它给了我一个Stream<Optional<Foo>>:
stream.findFirst().map(e -> e.getChildren())
Run Code Online (Sandbox Code Playgroud) 我最近进入了最后一轮面试。
在面试中,他们有一次要求我通过以下代码展示我的 Java 8 知识。Optional.of()他们要求我使用或 来减少以下代码Stream.of()。我完全被冻结了,我只使用过列表上的流,不知道如何使用可选方法。我没有专门因为这个原因得到这份工作,因为他们说我对java8的理解还不够好。有人可以告诉我他们在找什么吗?
概括
我被特别要求用or减少这些2行:Optional.of()Stream.of()
gameDto = gameplay.playRandomGame(gameDto);
repo.updateTotals(gameDto.getResult());
Run Code Online (Sandbox Code Playgroud)
一些上下文的总体片段:
@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());
}
}
Run Code Online (Sandbox Code Playgroud) java ×7
option-type ×5
java-8 ×4
java-stream ×3
lambda ×2
nullable ×2
java-17 ×1
null ×1
null-check ×1
optional ×1
record ×1