繁体   English   中英

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

[英]How to return null when list is empty in Java 8?

如果作为参数传递的列表为而不使用if语句,我该如何更改此方法以使其返回null

 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 ", "(", ")"));
}

您可以使用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 + ")";
    })

我建议不要返回 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 ", "(", ")"));
}

另一种方法是仅当列表非空且非空时才开始流式传输:

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 而不是()

List 时返回 null<object> 为空错误:[return.type.incompatible]<div id="text_translate"><p> 当 List 为空时,我试图返回 null:</p><pre> public List&lt;Object&gt; extractOutput(List&lt;Object&gt; accumulator) { if (accumulator.isEmpty()){ return null; } return accumulator; }</pre><p> 但我收到错误:[return.type.incompatible]。 如果我能解决这个问题,我将不胜感激。</p></div></object>

[英]return null when List<Object> is empty error: [return.type.incompatible]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM