2017-04-06 4 views
2

Stream<Tuple2<T,U>>을 javaslang 2.1.0-alpha로 Map<T,List<U>>으로 변환하는 가장 관용적 인 방법은 무엇입니까?javaslang 투 플루 메이트 2 목록 트랜스 포메이션

// initial stream 
    Stream.of(
      Tuple.of("foo", "x"), 
      Tuple.of("foo", "y"), 
      Tuple.of("bar", "x"), 
      Tuple.of("bar", "y"), 
      Tuple.of("bar", "z") 
    )   

이 될해야합니다

// end result 
    HashMap.ofEntries(
      Tuple.of("foo", List.of("x","y")), 
      Tuple.of("bar", List.of("x","y","z")) 
    ); 

답변

5

이 가장 관용적이지만이 foldLeft에 대한 작업 인 경우 확실하지 :

Stream 
    .of(
     Tuple.of("foo", "x"), 
     Tuple.of("foo", "y"), 
     Tuple.of("bar", "x"), 
     Tuple.of("bar", "y"), 
     Tuple.of("bar", "z") 
    ) 
    .foldLeft(
     HashMap.empty(), 
     (map, tuple) -> 
     map.put(tuple._1, map.getOrElse(tuple._1, List.empty()).append(tuple._2)) 
    ); 
+1

내가 API를 배우고의 창조자 해요, 그리고 배의 작업을 놓쳤다. 감사합니다 – Ghiro

6

@Opal이 옳다, foldLeft 갈 방법입니다 Tuples에서 HashMap을 생성합니다.

javaslang 2.1.0-alpha에는 Map과 유사한 데이터 구조로 튜플을 나타 내기 위해 Multimap이 추가로 있습니다.

// = HashMultimap[List]((foo, x), (foo, y), (bar, x), (bar, y), (bar, z)) 
Multimap<String, String> map = 
     HashMultimap.withSeq().ofEntries(
       Tuple.of("foo", "x"), 
       Tuple.of("foo", "y"), 
       Tuple.of("bar", "x"), 
       Tuple.of("bar", "y"), 
       Tuple.of("bar", "z") 
     ); 

// = Some(List(x, y)) 
map.get("foo"); 

지도가 더 처리 방법이 유용하게 사용할 수에 따라

(도 HashMultimap Javadoc을 참조하십시오).

면책 조항 : 나는 Javaslang

+0

이제 도구 상자에 다른 도구가 있다는 것을 알고 있습니다. 지금까지 훌륭한 도서관에 감사와 축하. – Ghiro

+0

감사합니다. –