Java 8中列表为空时如何返回null

时间:2019-02-19 12:39:40

标签: java java-8 java-stream optional

如何更改此方法,以便在将列表作为参数isEmpty传递时返回null? (不使用if

 default String getFiltersExpression(List<WorklistViewDto.Filter> filters) {
    return Optional.ofNullable(filters)
        .map(Collection::stream)
        .orElseGet(Stream::empty)
        .map(WorkListViewMapper::formatValue)
        .map(f -> f.getCriteria() + f.getOperator() + f.getValue())
        .collect(Collectors.joining(" AND ", "(", ")"));
}

3 个答案:

答案 0 :(得分:1)

我建议不要返回null而是返回一个"()"字符串作为此过滤器表达式,您可以在其中为空列表追加一个过滤器,如下所示:

String getFiltersExpression(List<Filter> filters) {
    return Optional.ofNullable(filters)
            .filter(l -> !l.isEmpty())
            .map(Collection::stream)
            .orElseGet(Stream::empty)
            .map(WorkListViewMapper::formatValue)
            .map(f -> f.getCriteria() + f.getOperator())
            .collect(Collectors.joining(" AND ", "(", ")"));
}

使用Java-9语法:

String getFiltersExpressions(List<Filter> filters) {
    return Stream.ofNullable(filters)
            .flatMap(Collection::stream)
            .map(WorkListViewMapper::formatValue)
            .map(f -> f.getCriteria() + f.getOperator() + f.getValue())
            .collect(Collectors.joining(" AND ", "(", ")"));
}

答案 1 :(得分:1)

您可以使用Collectors.collectingAndThen来做到这一点。

.collect( 
    Collectors.collectingAndThen(
        Collectors.joining(), 
        str->{
            if(str.isEmpty()) return null; 
            return str;
        }
     )
 );

鉴于OP的加入声明Collectors.joining(" AND ", "(", ")"),我们可以修改以上内容。

Collectors.collectingAndThen(
    Collectors.joining(" AND "), 
    str->{
            if(str.isEmpty()) return null; 
            return "(" + str + ")";
    })

答案 2 :(得分:1)

另一种方法是仅在列表为非null和非空时才开始流式传输:

default String getFiltersExpression(List<WorklistViewDto.Filter> filters) {
    return Optional.ofNullable(filters)
            .filter(fs -> !fs.isEmpty())
            .map(fs -> fs.stream()
                    .map(WorkListViewMapper::formatValue)
                    .map(f -> f.getCriteria() + f.getOperator() + f.getValue())
                    .collect(Collectors.joining(" AND ", "(", ")")))
            .orElse(null);
}

然后您将得到null而不是()