Weitgehend als akademische Übung, ich bin mit meiner eigenen Implementierung von Either
in Java, inspiriert von Haskell either
(https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Either.html) experimentierenPartitionieren einer Liste von Eithers in Java
Ich habe eine funktionierende Implementierung, die ich zufrieden bin mit:
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));
Das Äquivalent von Haskells lefts
rights
und ist ein Strom zu filtern:
Stream<String> s = streamOfEithers
.filter(Either::isLeft)
.map(x -> x.left())
Das Problem, das ich habe, ist in der Schaffung eines Äquivalents von Haskell partitionEithers
.
Mein erster Instinkt war:
streamOfEithers.collect(Collectors.groupingBy(Either::isLeft))
Allerdings scheint dies meine Art zu verlieren - es gibt Map<Boolean, Either<? extends Object, ? extends Object>>
statt (zum Beispiel) Map<Boolean, Either<String,Integer>
.
Natürlich ist das Ergebnis der Partitionierung natürlich nicht zwei Listen von Eithers
, sondern zwei Listen, eine von jedem Typ. Java hat kein Pair<T,U>
Klasse, aber wenn es vielleicht tat
List<Either<String,Integer>> listOfEithers = ...
Pair<List<String>,List<Integer>> partitioned = Either.partitionList(listOfEithers);
Ansonsten ist das beste, das ich es geschafft haben, ist:
Map<Boolean, Either<String,Integer>> partitioned = Either.partitionList(listOfEithers);
..., die für nicht eine sehr bequeme Struktur ein Klient.
Andere als ein Pair
schreiben, oder unter Verwendung eines Pair
aus einigen Sammlungen Bibliothek (Guava, nebenbei bemerkt, weigert Pair
zu schaffen, wie es „mehr Schaden anrichtet als gut“), wie kann ich partitionEithers
ein Äquivalent zu Haskell besten zur Verfügung stellen?
dies akzeptiert, wie es zu dem gleichen Schluss kommt wie ich - eine eigene Art gebraucht wird - ich ging für 'PartitionedEithers' und es machte unveränderlich. –
slim