Optional.ofNullable orElse 抛出 NPE

Tar*_*riv 1 java null optional java-8

我一直在使用此代码:

Event rEvent = new Event();

Map<Long, Message> msgMap = getMsg();
Message msg = msgMap.get(rEvent.getMsgId());

Long id = Optional.ofNullable(rEvent.getPkId()).orElse(msg.getPkId());
Run Code Online (Sandbox Code Playgroud)

假设rEvent.getPkId()和 msg 都是null。所以Optional.ofNullable(rEvent.getPkId())会被跳过,然后orElse被执行。这里抛出NPE. 如何使用Optional.ofNullable多个空检查重新编码?

YCF*_*F_L 5

在你的情况下,我会简单地使用一个简单的 if else:

Long id = null; // default value
if(rEvent.getPkId() != null) {
   id = rEvent.getPkId();
} else if(msg != null){
   id = msg.getPkId();
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你想练Optional,在这种情况下,你需要另一个Optionalmsg

Long message = Optional.ofNullable(msg)
        .map(Message::getPkId)
        .orElse(null);// default value OR:
        //.orElseThrow(() -> new IllegalArgumentException("Pk Id shouldn't be null."))

Long id = Optional.ofNullable(rEvent.getPkId()).orElse(message);
Run Code Online (Sandbox Code Playgroud)