alm*_*oul 5 java java-8 java-stream option-type
如何更改此方法,以便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 ", "(", ")"));
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Collectors.collectingAndThen来完成此操作。
.collect(
Collectors.collectingAndThen(
Collectors.joining(),
str->{
if(str.isEmpty()) return null;
return str;
}
)
);
Run Code Online (Sandbox Code Playgroud)
鉴于OP的加入声明,Collectors.joining(" AND ", "(", ")")我们可以修改上述内容。
Collectors.collectingAndThen(
Collectors.joining(" AND "),
str->{
if(str.isEmpty()) return null;
return "(" + str + ")";
})
Run Code Online (Sandbox Code Playgroud)
我建议不要返回 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 ", "(", ")"));
}
Run Code Online (Sandbox Code Playgroud)
使用 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 ", "(", ")"));
}
Run Code Online (Sandbox Code Playgroud)