从 Javaslang 中的 Map<?, Either> 中提取键和左值
Extract keys and left values from a Map<?, Either> in Javaslang
给定一个 Map<String, Either<Boolean, Integer>
,将其转换为仅包含布尔值条目的 Map<String, Boolean>
的最直接方法是什么?
现在我有这个:
Map<String, Boolean> boolMap = eitherMap
.filter(entry -> entry._2.isLeft())
.map((key, value) -> Tuple.of(key, value.getLeft())
;
这行得通,但似乎没有必要罗嗦,似乎应该有一些更严格的、一步到位的“平面图”解决方案。
免责声明:我是 Javaslang 的创造者
这里有一个基于javaslang-2.1.0-alpha的解决方案。我们利用了 Either 是右偏的这一事实。因为我们关注左边的值,所以我们交换了 Either。如果 flatMap 包含布尔值,则 flatMap 遍历 Either。
import javaslang.collection.Map;
import javaslang.control.Either;
import static javaslang.API.*;
public class Test {
public static void main(String[] args) {
Map<String, Either<Boolean, Integer>> map = Map(
"a", Left(true),
"b", Right(1),
"c", Left(false));
Map<String, Boolean> result =
map.flatMap((s, e) -> e.swap().map(b -> Tuple(s, b)));
// = HashMap((a, true), (c, false))
println(result);
}
}
您在 javaslang-2.0.5 中通过使用像 Tuple.of(s, b)
.
这样的静态工厂方法实现了同样的效果
给定一个 Map<String, Either<Boolean, Integer>
,将其转换为仅包含布尔值条目的 Map<String, Boolean>
的最直接方法是什么?
现在我有这个:
Map<String, Boolean> boolMap = eitherMap
.filter(entry -> entry._2.isLeft())
.map((key, value) -> Tuple.of(key, value.getLeft())
;
这行得通,但似乎没有必要罗嗦,似乎应该有一些更严格的、一步到位的“平面图”解决方案。
免责声明:我是 Javaslang 的创造者
这里有一个基于javaslang-2.1.0-alpha的解决方案。我们利用了 Either 是右偏的这一事实。因为我们关注左边的值,所以我们交换了 Either。如果 flatMap 包含布尔值,则 flatMap 遍历 Either。
import javaslang.collection.Map;
import javaslang.control.Either;
import static javaslang.API.*;
public class Test {
public static void main(String[] args) {
Map<String, Either<Boolean, Integer>> map = Map(
"a", Left(true),
"b", Right(1),
"c", Left(false));
Map<String, Boolean> result =
map.flatMap((s, e) -> e.swap().map(b -> Tuple(s, b)));
// = HashMap((a, true), (c, false))
println(result);
}
}
您在 javaslang-2.0.5 中通过使用像 Tuple.of(s, b)
.