有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在可选列表中查找字符串

我有一个可能为空的“块”列表。每个块都包含一个名称列表,该列表也可以为空。我试图找出所有块中是否有任何名称是单词“blurb”

我有以下代码,可以正常工作:

private boolean containsText(List<Blocks> blocks) {
        return Optional.ofNullable(blocks)
            .map(Collection::stream)
            .map(o -> o.map(Blocks::getNames))
            .map(e -> e.anyMatch(names -> names != null && names.contains("blurb")))
            .orElse(false);
}

但是由于getNames可能返回null,我必须在下一个语句中检查它。我可以在那一点上用另一个可选选项来包装它,但我最终会得到一个 Optional<Stream<Optional<List<String>>>>

使用names -> names != null 看起来更干净?或者有没有办法简化这一点


共 (3) 个答案

  1. # 1 楼答案

    另一个不使用Optional的简单变体是:

    private boolean containsText(List<Blocks> blocks) {
        return blocks != null && blocks.stream()
                .map(Blocks::getNames)
                .filter(Objects::nonNull)
                .anyMatch(list -> list.contains("blurb"));
    }
    

    注意:您的一个问题是,在设计中,您会说,“我有一个可能为空的‘块’列表”,您应该修复它,为这种表示返回一个空列表,然后去掉上面代码中的null检查

  2. # 2 楼答案

    在Java-9中,可以按如下方式使用Stream.ofNullable

    public boolean containsText(List<Blocks> blocks) {
        return Stream.ofNullable(blocks)
                .flatMap(b -> b.stream().map(Blocks::getNames).filter(Objects::nonNull))
                .anyMatch(s -> s.contains("blurb"));
    }
    
  3. # 3 楼答案

    我不建议使用Optional进行null检查。您可以使用三元运算符检查blocks是否为空,如果为空,只需返回false,否则将流式处理blocks列表并检查字符串

    return Objects.isNull(blocks) ? false : blocks.stream()
                                                 .map(Blocks::getNames)
                                                 .filter(Objects::nonNull)
                                                 .anyMatch(list->list.contains("blurb"));
    

    还可以为现有代码添加简单的null

    private boolean containsText(List<Blocks> blocks) {
        return Optional.ofNullable(blocks)
            .map(Collection::stream)
            .map(o -> o.map(Blocks::getNames).filter(Objects::nonNull))
            .map(e -> e.anyMatch(names -> names.contains("blurb")))
            .orElse(false);
    }