私はsingleOrEmpty
ストリームオペレーターの大ファンです。標準ライブラリにはありませんが、非常に便利です。ストリームに値が 1 つしかない場合、その値はOptional
. 値がない場合、または複数の値がある場合は、 を返しますOptional.empty()
。
Optional<Int> value = someList.stream().{singleOrEmpty}
[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.empty()
etc.
以前にそれについて質問したところ、@ThomasJungblutがこの素晴らしい実装を思いつきました。
public static <T> Optional<T> singleOrEmpty(Stream<T> stream) {
return stream.limit(2)
.map(Optional::ofNullable)
.reduce(Optional.empty(),
(a, b) -> a.isPresent() ^ b.isPresent() ? b : Optional.empty());
}
唯一の問題は、通話の最初に配置する必要があることです
singleOrEmpty(someList.stream().filter(...).map(...))
最後に順番にではなく
someList.stream().filter().map().singleOrEmpty()
これにより、他のストリーム メカニズムよりも読みにくくなります。
このストリーム処理の初心者として、ストリーム変換のシーケンスの最後singleOrEmpty
にショートサーキットメカニズムを配置する方法について何かコツを知っている人はいますか?