在这里中,有一种获取嵌套可选值或默认值的方法:
Optional<Computer> maybeComputer = Optional.of(computer);
String version = maybeComputer.flatMap(Computer::getSoundcard).flatMap(Soundcard::getUsb).map(USB::getVersion).orElse("UNKNOWN");或
Computer computer = ...;
String version = computer.getSoundcard().flatMap(Soundcard::getUsb).map(USB::getVersion).orElse("UNKNOWN");但是,我如何获得所有集合的计算机的所有版本?- List<Computer>
例如,如何使用unknown API、(包括)打印所有USB版本?
或
我如何将所有计算机映射到它们的声卡的USB版本,包括unknown版本?
谢谢。
电脑课:
public static class Computer {
private Optional<Soundcard> soundcard;
public Computer(Optional<Soundcard> soundcard) {
this.soundcard = soundcard;
}
public Optional<Soundcard> getSoundcard() {
return soundcard;
}
}
public static class Soundcard {
private Optional<USB> usb;
public Soundcard(Optional<USB> usb) {
this.usb = usb;
}
public Optional<USB> getUsb() {
return usb;
}
}
public static class USB {
private String version;
public String getVersion() {
return version;
}
}发布于 2016-09-25 09:08:08
只需流出计算机列表,并将您应用于单个Optional<Computer>的映射应用于每台计算机
List<String> versions =
computers.stream()
.map(c -> Optional.ofNullable(c) // takes care of null elements in your List
.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUsb)
.map(USB::getVersion)
.orElse("UNKNOWN"))
.collect(Collectors.toList());发布于 2016-09-26 10:33:42
如果您想使用Stream而不是可选API执行这些步骤,可以使用
computers.stream()
.filter(Objects::nonNull)
// Java 9: .flatMap(c -> c.getSoundcard().stream())
.flatMap(c -> c.getSoundcard().map(Stream::of).orElseGet(Stream::empty))
// Java 9: .flatMap(s -> s.getUSB().stream())
.flatMap(s -> s.getUsb().map(Stream::of).orElseGet(Stream::empty))
.map(USB::getVersion)
.forEach(System.out::println);它的不同之处在于它将跳过缺失的值,而不是用默认值ala "UNKNOWN"替换它们。无论如何,为属性“声卡的USB版本”生成一个掉落值的"UNKNOWN"是有问题的,这实际上可能意味着“不是USB设备”,也可能是“无声卡存在”…。
如果要保留原始逻辑,则必须将Optionals通过流样线,以便保留有关存在或缺勤的信息:
computers.stream()
.map(Optional::ofNullable)
.map(oc -> oc.flatMap(Computer::getSoundcard))
.map(os -> os.flatMap(Soundcard::getUsb))
.map(os -> os.map(USB::getVersion))
.map(ou -> ou.orElse("UNKNOWN"))
.forEach(System.out::println);这只是埃兰的回答的一个分解版本。请注意,这并不一定比使用null更简单。
computers.stream()
.map(c -> c==null? null: c.getSoundcard().orElse(null))
.map(s -> s==null? null: s.getUsb().orElse(null))
.map(u -> u==null? "UNKNOWN": u.getVersion())
.forEach(System.out::println);https://stackoverflow.com/questions/39685127
复制相似问题