【问题标题】:Extract keys and left values from a Map<?, Either> in Javaslang从 Javaslang 中的 Map<?, Either> 中提取键和左值
【发布时间】:2017-01-31 22:32:58
【问题描述】:

给定Map&lt;String, Either&lt;Boolean, Integer&gt;,将其转换为仅包含布尔值条目的Map&lt;String, Boolean&gt; 的最直接方法是什么?

现在我有这个:

Map<String, Boolean> boolMap = eitherMap
  .filter(entry -> entry._2.isLeft())
  .map((key, value) -> Tuple.of(key, value.getLeft())
;

这行得通,但似乎不必要地冗长,而且似乎应该有一些更紧凑的一步,“平面图????”解决方案。

【问题讨论】:

  • 我不熟悉 Javaslang,所以我不完全知道答案,但如果 Either 是一个“有偏见的”容器,它可能是可能的。如果不偏不倚,我认为您的解决方案可能是最简单的解决方案
  • @melston 你能解释一下“有偏见的容器”是什么意思吗?
  • 这通常用于具有两种可能状态之一的 Either-like 容器。有偏见的变体是一种状态是“成功”状态而另一种是错误或失败状态的变体。在这种情况下,平面映射的工作原理很像 Option,在 None 上调用 flatmap 只会返回 None,而在 Some(x) 上调用 flatmap 会在 x 上运行并继续。这种方法通常被称为面向铁路的编程,其中失败/无基本上停止处理。因此,在成功时调用 flatmap 会处理包含的值,而在失败时调用 flatmap 只会返回失败。

标签: functional-programming vavr


【解决方案1】:

免责声明:我是 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) 这样的静态工厂方法来实现相同的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2022-11-18
    • 2023-04-09
    相关资源
    最近更新 更多