假设我有一个Pair对象列表,
List<Pair<A,B>> listOfPairs = //some list of pairs ;
Run Code Online (Sandbox Code Playgroud)
我想将此列表分组为Map<A,Set<B>>.
目前,我可以分两步完成.第一步按A组,并返回
Map<A,Set<Pair<A,B>>如下:
Map<A,Set<Pair<A,B>> intermediateStep = listOfPairs.stream().collect(Collectors.groupingBy((Pair::getLeft), Collectors.toSet()));
Run Code Online (Sandbox Code Playgroud)
然后我流式传输上面地图的入口集并将它们收集到所需的最终结果中,主要是通过将每个Pair对象映射到其B值,并将它们收集到一个集合中:
Map<A, Set<B>> finalResult= intermediateStep.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().stream().map(Pair::getRight).collect(Collectors.toSet())));
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现预期的结果,也许是一步到位?换句话说,上述中间步骤按A分组,但分组的右侧返回整个Pair对象.我想按A分组,并在一步中将A指向其相关B的集合.
(我知道,仅仅因为我可以一步到位,并不意味着我应该这样做,因为可读性可能会受到影响,但我很好奇.)
谢谢!
我在我的 go 二进制文件中使用 confluent-kafka-go 库,这个库需要与 librdkafka 链接。我项目中的其他目标使用 librdkakfa,所以我使用 rules_foreign_cc 的 cmake_external 规则生成了静态 librdkafka.a 和 librdkafka++.a:
//this is my "third_party/kafka/BUILD" file:
load("@rules_foreign_cc//tools/build_defs:cmake.bzl", "cmake_external")
cmake_external(
name = "librdkafka",
cache_entries = {
"RDKAFKA_BUILD_STATIC": "ON",
"WITH_ZSTD": "OFF",
"WITH_SSL": "OFF",
"WITH_SASL": "OFF",
"ENABLE_LZ4_EXT": "OFF",
"WITH_LIBDL": "OFF",
},
lib_source = "@kafka//:all",
static_libraries = [
"librdkafka++.a",
"librdkafka.a",
],
visibility = ["//visibility:public"],
)
Run Code Online (Sandbox Code Playgroud)
生成 librdkafka 库和头文件就好了:
$ bazel build //third_party/kafka:librdkafka
INFO: Analysed target //third_party/kafka:librdkafka (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //third_party/kafka:librdkafka up-to-date:
bazel-genfiles/third_party/kafka/librdkafka/include …Run Code Online (Sandbox Code Playgroud)