在收集到地图流中时存储多个键的值

时间:2018-04-10 22:25:25

标签: java concurrency java-8 java-stream concurrenthashmap

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中。

1 个答案:

答案 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));

希望这个帮助