元组列表到映射转换的javaslang
javaslang List of Tuples2 to Map transormation
使用 javaslang 2.1.0-alpha 将 Stream<Tuple2<T,U>>
转换为 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")
)
应该变成:
// end result
HashMap.ofEntries(
Tuple.of("foo", List.of("x","y")),
Tuple.of("bar", List.of("x","y","z"))
);
不确定这是否是最惯用的,但这是 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))
);
@Opal 是对的,foldLeft 是从元组创建 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");
(另请参阅 HashMultimap Javadoc)
根据地图的进一步处理方式,这可能会派上用场。
免责声明:我是 Javaslang 的创造者
使用 javaslang 2.1.0-alpha 将 Stream<Tuple2<T,U>>
转换为 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")
)
应该变成:
// end result
HashMap.ofEntries(
Tuple.of("foo", List.of("x","y")),
Tuple.of("bar", List.of("x","y","z"))
);
不确定这是否是最惯用的,但这是 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))
);
@Opal 是对的,foldLeft 是从元组创建 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");
(另请参阅 HashMultimap Javadoc)
根据地图的进一步处理方式,这可能会派上用场。
免责声明:我是 Javaslang 的创造者