Java 可选。不可用的orElse抛出NPE
我一直在使用此代码:Java 可选。不可用的orElse抛出NPE,java,java-8,null,optional,Java,Java 8,Null,Optional,我一直在使用此代码: Event rEvent = new Event(); Map<Long, Message> msgMap = getMsg(); Message msg = msgMap.get(rEvent.getMsgId()); Long id = Optional.ofNullable(rEvent.getPkId()).orElse(msg.getPkId()); 假设rEvent.getPkId和msg都为null。 因此,将跳过可选的.ofNullable
Event rEvent = new Event();
Map<Long, Message> msgMap = getMsg();
Message msg = msgMap.get(rEvent.getMsgId());
Long id = Optional.ofNullable(rEvent.getPkId()).orElse(msg.getPkId());
假设rEvent.getPkId和msg都为null。
因此,将跳过可选的.ofNullablerEvent.getPkId,然后执行orElse。这里它抛出了NPE。
如何使用Optional.ofNullable对多个空检查重新编码?在您的情况下,我只需使用一个简单的if-else:
Long id = null; // default value
if(rEvent.getPkId() != null) {
id = rEvent.getPkId();
} else if(msg != null){
id = msg.getPkId();
}
但如果您想练习可选,在这种情况下,您需要另一个可选的msg:
在您的情况下,我只需使用一个简单的if-else:
Long id = null; // default value
if(rEvent.getPkId() != null) {
id = rEvent.getPkId();
} else if(msg != null){
id = msg.getPkId();
}
但如果您想练习可选,在这种情况下,您需要另一个可选的msg:
假设rEvent.getPkId为null,msg也为null。所以
将跳过可选的.ofNullablerEvent.getPkId,然后删除orElse
执行。这里它抛出空指针异常。如何重新编码
是否对多个空检查使用可选的.ofNullable
如果消息为空,则需要事先检查。考虑以下方法:
public static Long ofNullable(Long ...options){
return Arrays.stream(options).filter(Objects::nonNull).findFirst().orElseThrow();
}
在你的情况下:
Long messageID = (msg != null) ? msg.getPkId() : null;
Long id = ofNullable(rEvent.getPkId(), option2, .. option N -1, messageID);
我们首先检查msg是否为null,如果它仍然在nullable方法中使用,因为其他选项可能不为null,因此可以使用它
运行示例:
输出:
假设rEvent.getPkId为null,msg也为null。所以
将跳过可选的.ofNullablerEvent.getPkId,然后删除orElse
执行。这里它抛出空指针异常。如何重新编码
是否对多个空检查使用可选的.ofNullable
如果消息为空,则需要事先检查。考虑以下方法:
public static Long ofNullable(Long ...options){
return Arrays.stream(options).filter(Objects::nonNull).findFirst().orElseThrow();
}
在你的情况下:
Long messageID = (msg != null) ? msg.getPkId() : null;
Long id = ofNullable(rEvent.getPkId(), option2, .. option N -1, messageID);
我们首先检查msg是否为null,如果它仍然在nullable方法中使用,因为其他选项可能不为null,因此可以使用它
运行示例:
输出: