如何使用java 8 lambda表达式迭代两个流并保持计数

时间:2017-10-10 03:37:04

标签: java lambda java-8

我有两个列表流,一个是字符串(县),另一个是对象(txcArray)。我需要遍历两个列表并将一个县的实例与txcArray的实例进行比较,并且它们匹配增加一个计数器,如果他们不这样做,我会继续前进。我需要使用java 8 lambda表达式这样做,这是我到目前为止所做的。

counties.stream().forEach(a-> {
     txcArray.stream()
             .filter(b->b.getCounty().equals(a))
             .map(Map<String,Integer>)
});

1 个答案:

答案 0 :(得分:5)

您的错误是使用forEach

List<Long> counts = counties.stream()
    .map(a -> txcArray.stream().filter(b -> b.getCounty().equals(a)).count())
    .collect(Collectors.toList());

但是,执行counties.size() × txcArray.size()操作时效率不高。当列表较大时,这可能很容易失控。

最好使用

Map<String, Long> map = txcArray.stream()
    .collect(Collectors.groupingBy(b -> b.getCounty(), Collectors.counting()));
List<Long> counts = counties.stream()
    .map(a -> map.getOrDefault(a, 0L))
    .collect(Collectors.toList());

这将执行counties.size() + txcArray.size()操作,这对于较大的列表将更有效,因此,即使它不是单个流操作,而是使用中间存储,这是更可取的。