Map<String, String> x = ArrayListMultimap.create();
Map<String, Boolean> results1 = Maps.newHashMap();
Map<String, Boolean> results2 = Maps.newHashMap();
我有一个multimap,我需要遍历并进行一些昂贵的调用。为了节省时间,我想做一个并行流。我得到的结果可以有空值,必须存储在地图中。我知道如何以非并行方式执行此操作,但是我无法在并行流中执行此操作而不会遇到并发问题。我意识到我需要以某种方式将其转换为地图并收集结果,但我不知道如何返回多个键和值。我在想一个临时的单一地图,但也有多个密钥。
x.keySet().paralleStream().forEach(req -> {
try {
Response response = getResponseForRequest(req);
if(response.getTitles() != null) {
boolean titleAvail = response.getTitles().stream().allMatch(Avalibilty:Status);
x.get(req).forEach(y -> results1.put(y, titleAvail);
}
if(response.getDetails() != null) {
boolean detailStatus = //perform some stream operation on getDetails
x.get(req).forEach(y -> results2.put(y, detailStatus));
}
} catch(TimeoutException e) {
x.get(req).forEach(y -> {
results1.put(y, null);
results2.put(y, null);
})
} catch(Exception e) {
//log & do nothing
}
});
最终我要做的是调用getResponseForRequest,它会返回一个结果。然后根据响应,对于multimap中的每个键,将结果存储在2个映射results1和results2中。
答案 0 :(得分:0)
我认为您可以使用flatMap()
。
声明枚举:Availability {TITLE, DETAIL}
然后映射:
x.entrySet().parallelStream()
.map(entry -> {
// Construct mapping between y and Boolean here
return Map<Y, EnumMap<Availability, Boolean>>;
})
.flatMap(v -> v.entrySet().stream())
.collect(v -> toMap(v.getKey(), v.getValue(), (v1, v2) -> YOUR_DEFINE_MAPPER, ConcurrentHashMap::new));
希望这个帮助