强制 Streams.zip 迭代每个元素的最佳方法是什么(使用 Guava、Java)

Nex*_*red 0 java hashmap guava java-stream

我正在尝试使用 Streams.zip 创建地图。我不关心流返回的结果,我只需要为每个元素执行 lambda。这是我的代码

String x[] = {"a", "b"};
String y[] = {"c", "d"};

var data = new HashMap<String, String>();

var myStream = Streams.zip(Arrays.stream(x), Arrays.stream(y),
                (arg1, arg2) -> { data.put(arg1, arg2); return 0; };
var result = myStream.collect(Collectors.toList()); // ideally don't want this line
Run Code Online (Sandbox Code Playgroud)

如果没有 collect() 行,我不会填充地图,那么最简单的方法是什么,我尝试了 count() 而不是 collect ,但这完全是 zip 的快捷方式。或者是否有没有 Streams.zip 的更简单的单行解决方案来从两个列表填充地图?

Xae*_*ess 5

你应该使用Streams#forEachPair

String x[] = {"a", "b"};
String y[] = {"c", "d"};

var data = new HashMap<String, String>();

Streams.forEachPair(Arrays.stream(x), Arrays.stream(y), data::put);

System.out.println(data); // {a=c, b=d}
Run Code Online (Sandbox Code Playgroud)

显然如果你不需要控制HashMap,你可以只收集:

String x[] = {"a", "b"};
String y[] = {"c", "d"};

var result = Streams.zip(Arrays.stream(x), Arrays.stream(y), Maps::immutableEntry)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

System.out.println(result); // {a=c, b=d}
Run Code Online (Sandbox Code Playgroud)