java поток с дополнительным предикатом фильтра - PullRequest
1 голос
/ 31 марта 2020

Является ли это (версия 1):

   public List<Task> getTasks(Set<Task> tasks, Predicate<? super Task> predicate) {
    var stream = tasks.stream();
    if (predicate != null) stream.filter(predicate);
    // is the stream filtered if predicate != null ?
    return stream.collect(Collectors.toList());
}

таким же, как это (версия 2):

   public List<Task> getTasks(Set<Task> tasks, Predicate<? super Task> predicate) {
    var stream = tasks.stream();
    // do I must reassign the stream to have the filtering
    if (predicate != null) stream = stream.filter(predicate);
    return stream.collect(Collectors.toList());
}

РЕДАКТИРОВАТЬ:

Только версия 2 верна, версия 1 неверна.

Смежный вопрос:

Есть ли способ обойти промежуточную операцию, не используя решение версии 2? Например,

stream.filter(pred == null ? Void : predicate)
      .order(comparator == null ? Void : comparator);

Ответы [ 2 ]

4 голосов
/ 31 марта 2020

Нет, они не одинаковы. Вы должны выполнить повторное назначение Stream, поскольку фильтр не изменяет основной поток, он создает новый объект Stream. Очень хороший вопрос.

1 голос
/ 31 марта 2020

Ответ от @ Jason точно. В то время как первый блок кода ничего не filter из , поскольку вы не обновляете существующий stream, второй выборочно возвращает задачи на основе ненулевого предиката.

Кому Завершив ответ, вы можете упростить код до

public List<Task> getTaskss(Set<Task> tasks, Predicate<? super Task> predicate) {
    return predicate == null ? new ArrayList<>(tasks) :
            tasks.stream().filter(predicate).collect(Collectors.toList());
}
...