Java 8 lambda 表达式 : Mapping a Stream to type Integer and then calling sum() won't compile

标签 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("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 编译器编译此代码段时:

openjdk version "1.8.0-ea"
OpenJDK Runtime Environment (build 1.8.0-ea-lambda-night
OpenJDK 64-Bit Server VM (build 25.0-b21, mixed mode)

我得到以下编译错误:

java: cannot find symbol
  symbol:   method sum()
  location: interface java.util.stream.Stream<java.lang.Integer>

但是如果我将 getAge() 方法的返回值从 Integer 更改为 int,我会得到预期的结果。但有时不可能或不希望即时更改签名。当 getAge() 返回 Integer 类型时,有什么方法可以让它工作吗?

提前致谢

最佳答案

我认为他们正在改变方法

IntStream map(ToIntFunction<? super T> mapper)

IntStream mapToInt(ToIntFunction<? super T> mapper)

然后是你的

persons.stream().mapToInt(Person::getAge).sum()

将始终有效,无论 getAge() 返回 int 还是 Integer

查看此线程:http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-March/001480.html

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

关于Java 8 lambda 表达式 : Mapping a Stream to type Integer and then calling sum() won't compile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15556809/

相关文章:

c# - 将通用对象集合传递给需要基类型集合的方法

java - 我无法在 Android Studio 中 toast 消息

java - 第二个数字在 1 到 5 范围内(含)是什么意思?

java - ArrayList 的空指针异常

java - 列表实现 : does LinkedList really perform so poorly vs. ArrayList 和 TreeList?

Java 暴击位树

c# - 将异步回调传递给 Timer 构造函数

c# - 选择第一个匹配条件的对象或内部对象

java - 破损的 eclipse 能修复吗?

java - 在 Java lambda 中使用两个流来计算协方差