Dan*_* K. 14 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;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用以下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)
Run Code Online (Sandbox Code Playgroud)
我得到以下编译错误:
java: cannot find symbol
symbol: method sum()
location: interface java.util.stream.Stream<java.lang.Integer>
Run Code Online (Sandbox Code Playgroud)
但是如果我将getAge()方法的返回值从Integer更改为int,我会得到预期的结果.但有时候不可能或不希望在飞行中更改签名.当getAge()返回Integer类型时,有没有办法使这个工作?
谢谢,丹尼尔
Zho*_*gYu 18
我认为他们正在改变这种方法
IntStream map(ToIntFunction<? super T> mapper)
Run Code Online (Sandbox Code Playgroud)
至
IntStream mapToInt(ToIntFunction<? super T> mapper)
Run Code Online (Sandbox Code Playgroud)
然后你的
persons.stream().mapToInt(Person::getAge).sum()
Run Code Online (Sandbox Code Playgroud)
将永远有效,无论是getAge()
回报int
还是Integer
.
请参阅此主题:http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-March/001480.html
顺便说一句,你可以将你的问题发布到lambda-dev邮件列表,他们希望听到真实世界的经历.
归档时间: |
|
查看次数: |
21156 次 |
最近记录: |