Java8Lambdas:将流映射到Integer类型,然后调用sum()won';不编译

Java8Lambdas:将流映射到Integer类型,然后调用sum()won';不编译,java,collections,lambda,java-8,Java,Collections,Lambda,Java 8,我在玩Java8 lambda表达式。作为一个例子,我试图总结一份清单中的年龄: import java.util.Arrays; import java.util.List; public class Person { public static void main(String[] args) { List<Person> persons = Arrays.asList(new Person("FooBar", 12), new Person("BarF

我在玩Java8 lambda表达式。作为一个例子,我试图总结一份清单中的年龄:

import java.util.Arrays;
import java.util.List;

public class Person {
    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(new Person("FooBar", 12), new Person("BarFoo", 16));
        Integer sumOfAges = persons.stream().map(Person::getAge).sum();
        System.out.println("summedUpAges: " + sumOfAges);
    }

    private final String name;
    private final Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}
我得到以下编译错误:

java: cannot find symbol
  symbol:   method sum()
  location: interface java.util.stream.Stream<java.lang.Integer>
java:找不到符号
符号:方法和()
位置:接口java.util.stream.stream
但是,如果我将getAge()方法的返回值从Integer改为int,就会得到预期的结果。但有时不可能或不希望动态更改签名。当getAge()返回一个整数类型时,有什么方法可以使它工作吗

提前感谢,,
丹尼尔

我想他们正在改变方法

IntStream map(ToIntFunction<? super T> mapper)
无论
getAge()
返回
int
还是
Integer
,都将始终有效

请参阅此线程:


顺便说一句,您可以将您的问题发布到lambda dev邮件列表中,他们希望听到真实世界的体验。

他们没有改变方法,这两种方法都可用,因为map()是一种返回流的通用方法,并且他们已将int、long、,将双流分为单独的方法,例如mapToInt()、mapToLong()和mapToDouble()

是的,您可以使用reduce()方法

reduce(T恒等式,二进制运算符累加器)

使用关联累积函数对此流的元素执行缩减,并返回描述缩减值(如果有)的可选值

reduce()的工作原理:假设我们有int数组流,并应用reduce函数

减少(0,(l,r)->l+r)

在诸如1、2、3、4和5的整数列表中,种子0被添加到1,结果(1)被存储为累积值,然后除了作为流中的下一个数字(1+2)之外,该累积值还作为左值。结果(3)存储为累积值,并在下一次加法(3+3)中使用。结果(6)存储并用于下一次加法(6+4),结果用于最终加法(10+5),产生最终结果15

因此,您的示例如下所示:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Person {

    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(new Person("FooBar", 12), new Person("BarFoo", 16));
        Stream<Integer> stream = persons.stream().map(x -> x.getAge());
        int sum = stream.reduce(0, (l, r) -> l + r);
        System.out.println(sum);

    }

    private final String name;
    private final Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}
导入java.util.array;
导入java.util.List;
导入java.util.stream.stream;
公共阶层人士{
公共静态void main(字符串[]args){
List persons=Arrays.asList(新人(“FooBar”,12),新人(“BarFoo”,16));
Stream=persons.Stream().map(x->x.getAge());
int sum=流。reduce(0,(l,r)->l+r);
系统输出打印项数(总和);
}
私有最终字符串名;
私人最终整数年龄;
公众人物(字符串名称,整数年龄){
this.name=名称;
这个。年龄=年龄;
}
公共字符串getName(){
返回名称;
}
公共整数getAge(){
回归年龄;
}
}

要添加bayou.io答案,我更喜欢lambda表达式而不是方法引用

persons.stream().mapToInt(x->x.getAge()).sum();
reduce()
persons.stream().mapToInt(Person::getAge).sum()
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Person {

    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(new Person("FooBar", 12), new Person("BarFoo", 16));
        Stream<Integer> stream = persons.stream().map(x -> x.getAge());
        int sum = stream.reduce(0, (l, r) -> l + r);
        System.out.println(sum);

    }

    private final String name;
    private final Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}
persons.stream().mapToInt(x->x.getAge()).sum();