gpt4 book ai didi

java - 在 Java 中对 Eithers 列表进行分区

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:00 24 4
gpt4 key购买 nike

主要是作为一项学术练习,我正在试验自己对 Either 的实现。在 Java 中,灵感来自 Haskell 的 either ( https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Either.html )

我有一个我很满意的工作实现:

    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 的 leftsrights是过滤流:

 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来自一些 Collection 库( Guava ,顺便说一句,拒绝提供 Pair 因为它“弊大于利”),我怎样才能最好地提供相当于 Haskell 的 partitionEithers

最佳答案

您可以为此创建自己的聚合类型,代替 Pair,专门为 Either 定制,它有一个收集器。这是一个简化的实现:

class Aggregate<T, U> {
List<T> tList = new ArrayList<>();
List<U> uList = new ArrayList<>();

public void add(Either<T, U> e) {
if(e.isLeft()) {
tList.add(e.left());
} else {
uList.add(e.right());
}
}

public Aggregate<T, U> combine(Aggregate<T, U> other) {
tList.addAll(other.tList);
uList.addAll(other.uList);
return this; // could create a new Aggregate here instead...
}

public static <T, U> Collector<Either<T,U>, ? , Aggregate<T, U>> partitionEithers() {
return Collector.of(Aggregate::new, Aggregate::add, Aggregate::combine);
}
}

那么结果就变成了:

Aggregate<String, Integer> result = streamOfEithers.collect(Aggregate.partitionEithers());

关于java - 在 Java 中对 Eithers 列表进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41895717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com