我有两个列表流,一个是字符串(县),另一个是对象(txcArray)。我需要遍历两个列表并将一个县的实例与txcArray的实例进行比较,并且它们匹配增加一个计数器,如果他们不这样做,我会继续前进。我需要使用java 8 lambda表达式这样做,这是我到目前为止所做的。
counties.stream().forEach(a-> {
txcArray.stream()
.filter(b->b.getCounty().equals(a))
.map(Map<String,Integer>)
});
答案 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()
操作,这对于较大的列表将更有效,因此,即使它不是单个流操作,而是使用中间存储,这是更可取的。