Как вернуть NULL, когда список пуст в Java 8 - PullRequest
0 голосов
/ 19 февраля 2019

как я могу изменить этот метод, чтобы он возвращал ноль, если список передан как параметр isEmpty?(без использования 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 голосов
/ 19 февраля 2019

Вы можете сделать это с помощью 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 + ")";
    })
0 голосов
/ 19 февраля 2019

Альтернативный способ - начать потоковую передачу, только если список не нулевой и не пустой:

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);
}

Тогда вместо ().

вы получите ноль.
0 голосов
/ 19 февраля 2019

Я бы рекомендовал не возвращать 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 ", "(", ")"));
}
...