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)
@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的创造者
不确定这是否是最惯用的,但这是工作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)