我想使用可选的<>保持对nullpointexception的检查,柜面然后就发生了一些otherthing打印。 (https://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html)
我设置声卡为null,还是我得到NullPointerException异常,但我想与功能,避免它。
主类(计算机)
import java.util.Optional;
public class Computer {
public Optional<SoundCard> getSoundcard() {
return soundcard;
}
public void setSoundcard(Optional<SoundCard> soundcard) {
this.soundcard = soundcard;
}
private Optional<SoundCard> soundcard = null ;
public static void main(String[] args)
{
Optional<Computer> computer = Optional.of(new Computer());;
String verion = computer.flatMap(Computer::getSoundcard)
.flatMap(SoundCard::getUsb)
.map(USB::getVersion)
.orElse("Unknown");
System.out.println(verion);
}
}
另一类声卡
import java.util.Optional;
public class SoundCard {
public Optional<USB> getUsb() {
return usb;
}
public void setUsb(Optional<USB> usb) {
this.usb = usb;
}
private Optional<USB> usb = null;
}
另一类(USB)
public class USB {
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
private String version;
}
任何提示或帮助是值得欢迎:)
// computer initialization
Optional<Computer> computer = Optional.of(new Computer());
// Applying operations to Optional<Computer>: stream() is for Collections, not for Optionals
String version = computer.flatMap(Computer::getSoundcard)
.flatMap(SoundCard::getUsb)
.map(USB::getVersion)
.orElse("Unknown");
更新
此外,像Computer.soundcard
(具有类型Optional
)字段不应该与null
值,但使用Optional.empty()
初始化,以避免NullPointerException
或类似的错误...
因此,完整的代码
public class Computer {
public Optional<SoundCard> getSoundcard() {
return soundcard;
}
public void setSoundcard(Optional<SoundCard> soundcard) {
this.soundcard = soundcard;
}
private Optional<SoundCard> soundcard = Optional.empty() ;
public static void main(String[] args)
{
Optional<Computer> computer = Optional.of(new Computer());
String version = computer
.flatMap(Computer::getSoundcard)
.flatMap(SoundCard::getUsb)
.map(USB::getVersion)
.orElse("Unknown");
System.out.println(version);
}
}
class SoundCard {
public Optional<USB> getUsb() {
return usb;
}
public void setUsb(Optional<USB> usb) {
this.usb = usb;
}
private Optional<USB> usb = Optional.empty();
}
class USB {
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
private String version;
}
你应该初始化变量电脑:
Optional<Computer> computer = Optional.of(new Computer());
你做的方式,computer
是真的不初始化。
假设你使用的是Java 8,这里的Optional
类的javadoc,这是这样说的:
的容器对象,其可以或可以不包含一个非空值。如果值存在,isPresent()将返回true和get()将返回值。
现在,stream()
的东西,对对象的集合,而不是单个对象的作品。 Here's为stream()
的文档:
返回与此集合作为其源的连续流。基本上,你需要有一个
List<Computer>
为了调用stream()
,执行过滤和Optional<Computer>
方法(S)返回find
。
当你试图调用stream()
单个对象,而不是一个集合,它显示了一个错误。
此外,呼吁在Java中的非实例变量的任何方法将总是产生编译错误,例如:
Optional<Computer> computer ;
computer.stream(); // compilation error
所以,我们首先需要初始化,并确保我们呼吁基于引用的类型的正确方法。