でEithersのリストを分割、私はHaskellのeither
(https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Either.html)に触発され、JavaでEither
の私の独自の実装を試してい主に学術的な運動としてのJava
私は喜んでいる作業の実装を持っています:
Stream<String> s = streamOfEithers
.filter(Either::isLeft)
.map(x -> x.left())
:
Either<String, Integer> either = Either.left(A_STRING);
assertThat(either.left(), is(A_STRING));
assertThat(either.isLeft(), is(true));
assertThat(either.isRight(), is(false));
assertThat(either.map(x -> AN_INTEGER, y -> A_LONG), is(Either.left(AN_INTEGER)));
assertThat(either.consolidate(x -> A_LONG, y -> ANOTHER_LONG), is(A_LONG));
Haskellのlefts
の同等とrights
ストリームをフィルタリングすることです
私が抱えている問題は、HaskellのpartitionEithers
と同等のものを作成することです。
私の最初の本能た:
streamOfEithers.collect(Collectors.groupingBy(Either::isLeft))
しかし、これは私のタイプを失うようだ - それは、(例えば)Map<Boolean, Either<? extends Object, ? extends Object>>
ではなく、Map<Boolean, Either<String,Integer>
を返します。
もちろん、パーティション化の結果はEithers
という2つのリストではなく、それぞれのタイプのリストが2つあります。 JavaはPair<T,U>
クラスを持っていないが、それはしなかった場合は、おそらく:
List<Either<String,Integer>> listOfEithers = ...
Pair<List<String>,List<Integer>> partitioned = Either.partitionList(listOfEithers);
をそれ以外の場合は、私が管理している最高のは、次のとおりです。
Map<Boolean, Either<String,Integer>> partitioned = Either.partitionList(listOfEithers);
...のために非常に便利な構造ではないいますクライアント。
Pair
を書いて、またはいくつかのコレクションライブラリから
Pair
を使用するよりも他の
(グアバは、ちなみに、それは「良いよりも害を行います」とPair
を提供することを拒否)、どのように私は最高のHaskellのpartitionEithers
に相当するものを提供することができますか?
- カスタムタイプが必要とされている - 私は 'PartitionedEithers'のために行って、それを作ったし不変。 –
slim