相反,您可以通过习惯性地使用流API以稍微不同的方式来解决这个问题。
首先,嵌套操作可以在单个流管道中完成:
mapB.entrySet()
.parallelStream()
.filter(y -> y.getValue().equals(x.getValue()))
.map(y -> y.getKey())
.sorted()
.forEach(val -> {
synchronized (this) {
res.add(x.getKey());
res.add((Integer) val);
}
});
其次,为了避免并发问题,最简单的方法是放弃命令式方法并利用流API的声明性。
for-each
然后
add
这里要做的是通过替换
mapA
具有自定义序列的entrySet():
List<Integer> res = mapA.entrySet()
.parallelStream()
.flatMap(x -> mapB.entrySet().stream()
.filter(y -> y.getValue().equals(x.getValue()))
.map(Map.Entry::getKey)
.sorted()
.flatMap(v -> Stream.of(x.getKey(), v)))
.collect(Collectors.toList());
嵌套
parallelStream
可以省略,因为
flatMap
sequential()
反正是在小溪上。