javaslang元组列表2映射转换

Ghi*_*iro 5 functional-programming vavr

使用javaslang 2.1.0-alpha 将a Stream<Tuple2<T,U>>转换为a 的最惯用的方法是什么Map<T,List<U>>

    // initial stream
    Stream.of(
            Tuple.of("foo", "x"),
            Tuple.of("foo", "y"),
            Tuple.of("bar", "x"),
            Tuple.of("bar", "y"),
            Tuple.of("bar", "z")
    )        
Run Code Online (Sandbox Code Playgroud)

应成为:

    // end result
    HashMap.ofEntries(
            Tuple.of("foo", List.of("x","y")),
            Tuple.of("bar", List.of("x","y","z"))
    );
Run Code Online (Sandbox Code Playgroud)

Dan*_*ich 8

@Opal是对的,foldLeft是从Tuples创建HashMap的方法.

在javaslang 2.1.0-alpha中,我们还有Multimap在类似Map的数据结构中表示元组.

// = 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");
Run Code Online (Sandbox Code Playgroud)

(另请参阅HashMultimap Javadoc)

根据地图的进一步处理方式,这可能会派上用场.

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


Opa*_*pal 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))
   );
Run Code Online (Sandbox Code Playgroud)