2017-10-10 28 views
3

我有两个列表流,一个是字符串(县)和一个对象(txcArray)。我需要遍历两个列表,并将一个县的实例与一个txcArray的实例进行比较,它们匹配增加一个计数器,如果它们不匹配,我会继续前进。我需要使用java 8 lambda表达式来做到这一点,这是我迄今为止所做的。我如何使用Java 8 lambda表达式迭代两个流并保持计数

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

我认为你的意思是:你有“两个清单”而不是“两个清单流”?所以你只需要计算你的谓词中对象数组中匹配的字符串列表中有多少项目?如果是这样:忘记'.forEach'并尝试先使用'.filter'和'.count()'来解决它。如果有效,您可以继续使用'.map'在过滤之前将对象转换为国家/地区字符串。最后,你甚至可能想尝试使用方法引用。我不会从Grisha关于'zip'的建议开始,因为它似乎对于你想要解决的问题更复杂。 – Roland

+0

让我再说一遍这个问题。我有一个类型字符串和另一个类型为texasCitiesClass(txcArray)的列表。 texasCitiesClass包含城市名称,县和人口。我拥有县名单中的所有独特县。我需要做的是检查县的每个实例出现在txcArray中的次数,并将每个县的此数字添​​加到另一个整型或长整型列表中。约束条件是我有意使用流和lambda表达式来完成此操作。感谢您的帮助,Grisha和Roland –

回答

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()操作,这将是对于较大的列表更有效,因此,优选的,即使它不是一个单一的数据流的操作,但使用中间存储。