代码之家  ›  专栏  ›  技术社区  ›  userit1985

从可空列表创建Java8流

  •  3
  • userit1985  · 技术社区  · 6 年前

    有没有方法检查java8中的空值,如果list为空,则返回空值,否则执行操作。

     public Builder withColors(List<String> colors) {
            this.colors= colors== null ? null :
                    colors.stream()
                    .filter(Objects::nonNull)
                    .map(color-> Color.valueOf(color))
                    .collect(Collectors.toList());
    
            return this;
        }
    

    我知道有个选择

    Optional.ofNullable(list).map(List::stream) 
    

    但这样我就得到了关于color.valueof(color)的错误代码

    谢谢

    2 回复  |  直到 6 年前
        1
  •  2
  •   Eran    6 年前

    Optional.ofNullable(list).map(List::stream) 会给你一个 Optional<Stream<String>> ,你不能打电话给 filter 打开。

    你可以把整个 Stream 内部处理 Optional map() 以下内容:

    public Builder withColors(List<String> colors) {
        this.colors = Optional.ofNullable(colors).map(
            list -> list.stream()
                        .filter(Objects::nonNull)
                        .map(color-> Color.valueOf(color))
                        .collect(Collectors.toList()))
                        .orElse(null);
        return this;
    }
    
        2
  •  2
  •   Eugene    6 年前

    有几件事你应该重新考虑。

    首先可能会经过一个 Set<String> colors 而不是 List 会更有意义的,因为看起来 Color 是以枚举开头的。那么,也许检查一下 equalsIgnoreCase ,所以 red RED 仍将生成枚举实例。也是一个 if statement 可能更容易检查可能为空的输入。最后一次流到相反的方向 enum 为了简单起见,我没有实现上面的建议会更有意义(也避免空检查)。

    public Builder withColors(List<String> colors) {
        if(colors == null){
            this.colors = Collection.emptyList();
        }
    
        this.colors = EnumSet.allOf(Color.class)
                .stream()
                .filter(x -> colors.stream().anyMatch(y -> x.toString().equals(y)))
                .collect(Collectors.toList());
        return this;
    }