オプションのフィルタ述語を持つJavaストリーム

nimo23:

この(バージョン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());
}

EDIT:

唯一のバージョン2は、バージョン1が正しくない、正しいです。

関連質問:

バージョン2の溶液を使用せずにitermediate操作バイパスする方法はありますか?例えば、

stream.filter(pred == null ? Void : predicate)
      .order(comparator == null ? Void : comparator);
ジェイソン:

彼らは同じではありませんありません。あなたは、フィルタは、それが新しいStreamオブジェクトを作成し、基になるストリームを変異させていないため、ストリームに再割り当てを行う必要があります。しかし非常に良い質問。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=379120&siteId=1