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

如何使用Java8Lambda表达式迭代两个流并保持计数,java,lambda,java-8,Java,Lambda,Java 8,我有两个列表,一个是字符串(县),另一个是对象(txcArray)。我需要遍历这两个列表,并将Countries实例与txcArray实例进行比较,它们与递增计数器匹配,如果不匹配,我将继续。我需要使用Java8Lambda表达式来实现这一点,这就是我目前所拥有的 counties.stream().forEach(a-> { txcArray.stream() .filter(b->b.getCounty().equals(a))

我有两个列表,一个是字符串(县),另一个是对象(txcArray)。我需要遍历这两个列表,并将Countries实例与txcArray实例进行比较,它们与递增计数器匹配,如果不匹配,我将继续。我需要使用Java8Lambda表达式来实现这一点,这就是我目前所拥有的

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

您的错误是使用了
forEach

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

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

我想你的意思是:你有“两个列表”而不是“两个列表-流”?因此,您只想计算字符串列表中与谓词相关的对象数组中匹配的项的数量?如果是这样的话:忘记
.forEach
,首先尝试使用
.filter
.count()
解决它。如果有效,您可以继续使用
.map
将对象转换为国家/地区字符串,然后再进行筛选。最后,您甚至可能希望尝试使用方法引用。我不会从Grisha关于
zip
的建议开始,因为这对于您试图解决的问题来说似乎更复杂。让我再说一遍这个问题。我有一个string类型的列表和另一个texasCitiesClass类型的lis(txcArray)。TexaScienties类包含城市名称、县和人口。我有县列表中所有独特的县。我需要做的是检查Countries中的每个实例在txcArray中出现的次数,并将每个Countries的这个数字添加到另一个integer或long类型的列表中。约束条件是,我只能使用流和lambda表达式来实现这一点。谢谢你的帮助,格里沙和罗兰
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());