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

Oct*_*cia 3 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>)
});
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 6

你的错误在于使用forEach.

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

但是,这不是非常有效,执行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());
Run Code Online (Sandbox Code Playgroud)

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