2017-01-31 4 views
1

与えられたMap<String, Either<Boolean, Integer>の場合、ブール値を持つエントリのみを含むMap<String, Boolean>に変換する最も簡単な方法は何ですか?これは動作しますが、不必要に長ったらしいようだ、と解決「というflatmap」いくつかのタイトな、ワンステップ、そこにする必要がありますようにそれはそうJavaslangの<?, Either>のキーと左の値を抽出する

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

今、私はこれを持っています。

+0

私はJavaslangに精通していないので、私は答えを完全には知らないのですが、いずれかが「バイアスされた」コンテナであれば可能かもしれません。それが偏っていれば、あなたのソリューションは最も単純なものかもしれません。 – melston

+0

@melston「偏った容器」が意味することを明確にすることはできますか? –

+0

これは通常、2つの可能な状態のいずれかを持つEitherのようなコンテナで使用されます。バイアスされたバリアントは、1つの状態が「成功」状態であり、もう1つがエラーまたは障害状態であるものです。この場合、flatmappingはOptionと同じように動作します。Noneの場合はflatmapを呼び出すだけでNoneが返されますが、Some(x)の場合はflatmapを呼び出してxを操作し続けます。このアプローチは、鉄道指向プログラミングと呼ばれることが多く、障害/なしは基本的に処理を停止します。したがって、成功した場合にflatmapを呼び出すと、含まれていた値が処理され、失敗した場合はflatmapを呼び出すだけで失敗が返されます。 – melston

答えて

2

免責事項:私はここでJavaslang

の生みの親だがjavaslang-2.1.0-αに基づいたソリューションです。私たちはどちらかが右に偏っているという事実を利用します。左の値に焦点を当てるので、我々はどちらかを交換します。 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で同じことができます。

関連する問題