过滤可选字符串列表

filter a list of optional strings

给定一个方法,例如

public Optional<List<String>> removeShortWords(Optional<List<String>> maybeWords) {
    
}

有没有办法过滤掉所有少于5个字符的字符串? 一种方法是解包 Optional,过滤掉短词,然后将结果包装在新的 Optional:

public Optional<List<String>> removeShortWords(Optional<List<String>> maybeWords) {

    if (maybeWords.isPresent()) {
        List<String> words = maybeWords.get();

        List<String> longWords = words.stream()
            .filter(word -> word.length() >= 5)
            .collect(Collectors.toList());

        return Optional.of(longWords);
    }

    return maybeWords;
}

肯定有比这更简单的解决方案吗?

您可以使用 Optional#ifPresent and Collection#removeIf.

public Optional<List<String>> removeShortWords(Optional<List<String>> maybeWords) {
    maybeWords.ifPresent(list -> list.removeIf(str -> str.length() < 5));
    return maybeWords;
}

Optional provides methods, such as Optional#map,允许您修改其值(如果该值存在)。你可以在你的情况下使用它:

public Optional<List<String>> removeShortWords(Optional<List<String>> maybeWords) {
    return maybeWords.map(list -> 
        list.stream().filter(s -> s.length() >= 5).collect(Collectors.toList()));
}

使用map:

public Optional<List<String>> removeShortWords(Optional<List<String>> maybeWords) {
    return maybeWords.map(x -> x.stream().filter(y -> y.length() >= 5)
        .collect(Collectors.toList()));
}

但是,您应该注意 Optional 是为方法返回类型设计的,而不是为参数设计的。我只接受 List<String>,因为 List<String> 已经可以为 null。并“正常”检查空值。有关详细信息,请参阅