すべての中間ステップは、ストリームパイプライン全体に影響します。 noDiscardingFilter
のステップは、collect
の操作ではなく、後でチェーン化されたものに影響します。あなたが条件付きの機能を持つようにしたい場合は、そのように実装するより明確になります:
public static <T> Function<T,T> conditional(
Predicate<? super T> p, Function<T, ? extends T> f) {
return obj -> p.test(obj)? f.apply(obj): obj;
}
これは
assertEquals(Stream.of(1, 2, 3)
.map(conditional(x -> x!=1, x -> x*10))
.collect(Collectors.toList()),
Arrays.asList(1, 20, 30)
);
または
Stream.of(1, 5, null, 3, null, 4)
.map(conditional(Objects::isNull, x -> 0)) // replacing null with default value
.forEach(System.out::println);
または
として使用することができます
Stream.of(1, 5, null, 3, null, 4)
.map(conditional(Objects::nonNull, x -> x*10)) // null-safe calculation
.forEach(System.out::println);
これらの使用例ではどのように注意してくださいconditional
に渡された述語および関数が、連鎖ストリーム操作とは異なる同じスコープに属していることがすぐに分かります。
map()中間演算でそれをやってみませんか? –
そのような操作やトリックがあれば質問してください。 – Whimusical
*問題を解決する方法についての回答を得る必要はありません。私が知っていることが嬉しいものを見せてくれるだけの実用的な方法です。あなたは*ファンシー*が意味するものを定義/定量化できますか? – CKing