从Javaslang

时间:2017-01-31 22:32:58

标签: functional-programming vavr

给定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())
;

这很有效,但似乎没有多少罗嗦,似乎应该有一些更紧凑,一步到位的“flatmap that”解决方案。

1 个答案:

答案 0 :(得分:2)

免责声明:我是Javaslang的创作者

这是一个基于javaslang-2.1.0-alpha的解决方案。我们利用了这两个事实是正确的偏见。因为我们专注于左侧值,所以我们交换了Either。 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);

        }
    }

您可以使用Tuple.of(s, b)等静态工厂方法在javaslang-2.0.5中实现相同的目标。