2017-01-31 3 views
1

Map<String, Either<Boolean, Integer>이 주어지면 부울 값을 가진 항목 만 포함하는 Map<String, Boolean>으로 변환하는 가장 쉬운 방법은 무엇입니까?Javaslang에서 <?, Either>의 키와 왼쪽 값 추출

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

이 작동하지만, 불필요하게 장황 것, 그리고 몇 가지 엄격한, 한 단계가 있어야 것 같다 솔루션 "그 flatmap"

는 지금은이 있습니다.

+0

Javaslang에 익숙하지 않아서 답변을 완전히 알지 못하지만 둘 중 하나가 '편향된'컨테이너 일 수 있습니다. 편향되지 않는다면 당신의 솔루션은 가장 단순한 것일 수도 있습니다. – melston

+0

@melston '편향된 컨테이너'가 의미하는 바를 명확히 할 수 있습니까? –

+0

이것은 일반적으로 가능한 두 가지 상태 중 하나와 함께 하나의 컨테이너로 사용됩니다. 편향된 변형은 하나의 상태가 '성공적인'상태이고 다른 하나는 오류 또는 실패 상태 인 변형입니다. 이 경우 flatmapping은 Option과 매우 비슷하게 동작합니다. None에 대한 flatmap 호출은 None을 반환하고, Some (x)에 대한 flatmap 호출은 x에 대해 계속 작동합니다. 이 접근법은 흔히 철도/철도 중심 프로그래밍으로 불리며, 실패/없음은 기본적으로 처리를 중단합니다. 따라서 성공시 flatmap을 호출하면 포함 된 값을 처리하는 반면 실패하면 flatmap을 호출하면 실패가 반환됩니다. – melston

답변

2

면책 조항 : 내가

Javaslang

의 창조자 해요 여기 javaslang-2.1.0 알파 기반으로하는 솔루션이다. 우리는 어느 것이 편파적이라는 사실을 이용합니다. 왼쪽 값에 초점을 맞추기 때문에 우리는 양쪽 모두를 바꿉니다. boolean이 포함되어 있으면 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에서 같은 결과를 얻을 수 있습니다.