首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8:使用嵌套选项获取集合的默认值

Java 8:使用嵌套选项获取集合的默认值
EN

Stack Overflow用户
提问于 2016-09-25 09:02:56
回答 2查看 4.4K关注 0票数 2

这里中,有一种获取嵌套可选值或默认值的方法:

代码语言:javascript
复制
Optional<Computer> maybeComputer = Optional.of(computer);
String version = maybeComputer.flatMap(Computer::getSoundcard).flatMap(Soundcard::getUsb).map(USB::getVersion).orElse("UNKNOWN");

代码语言:javascript
复制
Computer computer = ...;
String version = computer.getSoundcard().flatMap(Soundcard::getUsb).map(USB::getVersion).orElse("UNKNOWN");

但是,我如何获得所有集合的计算机的所有版本?- List<Computer>

例如,如何使用unknown API、(包括)打印所有USB版本?

我如何将所有计算机映射到它们的声卡的USB版本,包括unknown版本?

谢谢。

电脑课:

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-09-25 09:08:08

只需流出计算机列表,并将您应用于单个Optional<Computer>的映射应用于每台计算机

代码语言:javascript
复制
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());
票数 4
EN

Stack Overflow用户

发布于 2016-09-26 10:33:42

如果您想使用Stream而不是可选API执行这些步骤,可以使用

代码语言:javascript
复制
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通过流样线,以便保留有关存在或缺勤的信息:

代码语言:javascript
复制
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更简单。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39685127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档