在函数式编程java中不能取消对布尔值的引用

在函数式编程java中不能取消对布尔值的引用,java,functional-programming,java-stream,Java,Functional Programming,Java Stream,我对Java中的函数式编程相当陌生。我只是在练习创建一些简单的方法,但我在这里遇到了一个错误: public void printCountSightingsOf(String animal) { sightings.stream() .filter(s -> s.getAnimal().equalsIgnoreCase(animal) .map(sa -> sa.getCount()) .red

我对Java中的函数式编程相当陌生。我只是在练习创建一些简单的方法,但我在这里遇到了一个错误:

public void printCountSightingsOf(String animal)
{
    sightings.stream()
             .filter(s -> s.getAnimal().equalsIgnoreCase(animal) 
             .map(sa -> sa.getCount())
             .reduce(0, (total, s) -> total + s));
    System.out.println(sightings);
}
它应该从一个文件中获取一份公园内动物的目击列表,并将其转换为一条小溪。然后,它应该过滤该列表,以便仅检索特定动物的目击。然后map函数应该将该列表转换为int类型的列表,其中每个元素都是某个人看到该动物的次数。最终,它应该将该列表缩减为唯一的总和,并打印出该数字。 错误在.map行上。它给了我这个错误:

布尔值不能被取消引用。为什么?XD


您的代码在
.map
之前的行中缺少一个右括号:

sightings.stream()
         .filter(s -> s.getAnimal().equalsIgnoreCase(animal) 
         // missing bracket                            here ^
         .map(sa -> sa.getCount())
         .reduce(0, (total, s) -> total + s));
         // redundant bracket          here ^
正确的代码是

sightings.stream()
         .filter(s -> s.getAnimal().equalsIgnoreCase(animal)) 
         .mapToInt(sa -> sa.getCount())
         .sum();

reduce
括号后还有一个额外的
。@illyakysi要得到一个完美的答案,您还应该显示优化:
.mapToInt(sa->sa.getCount()).sum()
您的缩减可以改进为
.mapToInt(sa->sa.getCount()).reduce(0,(total,s)->total+s)以避免装箱/取消装箱。。。或者更好的
.mapToInt(sa->sa.getCount()).sum()