corriente de java con predicado de filtro opcional

nimo23:

Es este (versión 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());
}

lo mismo que esto (versión 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());
}

EDITAR:

Sólo la versión 2 es correcta, la versión 1 es incorrecta.

pregunta relacionada:

¿Hay una manera de evitar una operación itermediate sin necesidad de utilizar la solución de la versión 2? Por ejemplo,

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

No, no son lo mismo. Que tiene que hacer el cambio de destino de flujo de filtro porque no muta la secuencia subyacente se crea un nuevo objeto Stream. Muy buena pregunta, sin embargo.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=379125&siteId=1
Recomendado
Clasificación