主要由於一項學術活動,我有我自己的實現在Java的Either
,靈感來自實驗Haskell的either
(https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Either.html)分區中的Java Eithers列表
我有一個工作的實施,我很高興用:
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
是過濾流:
Stream<String> s = streamOfEithers
.filter(Either::isLeft)
.map(x -> x.left())
我遇到的問題是創建一個相當於Haskell的partitionEithers
。
我的第一反應是:
streamOfEithers.collect(Collectors.groupingBy(Either::isLeft))
然而,這似乎失去了我的類型 - 它返回Map<Boolean, Either<? extends Object, ? extends Object>>
,而不是(例如)Map<Boolean, Either<String,Integer>
。
當然,理想情況下,分區的結果不是兩個列表Eithers
,而是兩個列表,每個列表中的一個。 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