Ton*_*ang 8 java lambda java-8
我正在阅读新发布的Java 8 in Action,发现第5章中有一段代码没有编译:
List<Integer> numbers1 = Arrays.asList(1, 2, 3);
List<Integer> numbers2 = Arrays.asList(3, 4);
List<int[]> pairs =
numbers1.stream()
.flatMap((Integer i) -> numbers2.stream()
.map(j -> new int[]{i, j})
)
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
Eclipse说:"类型不匹配:无法转换List<Object>为List<int[]>"
在与作者对Github的内容进行比较后,编译如下:
List<Integer> numbers1 = Arrays.asList(1, 2, 3);
List<Integer> numbers2 = Arrays.asList(3, 4);
List<int[]> pairs =
numbers1.stream()
.flatMap((Integer i) -> numbers2.stream()
.map((Integer j) -> new int[]{i, j})
)
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
唯一的变化是从"j"到"(整数j)".
但是第一个版本是不是完全等同于Java 8提供的语法糖的第二个版本?为什么Java拒绝编译它?
谢谢
BTW:
java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) Client VM (build 25.20-b23, mixed mode)
Run Code Online (Sandbox Code Playgroud)
Bri*_*etz 15
首先,纠正你的术语:当你说语法糖时,你真正要问的是类型推断,当被要求推断j内部lambda中的类型时,编译器无法提出正确的类型.
第二,纠正您的数据:您引用的错误消息不是来自JDK编译器; 他们来自Eclipse.
这只是一个Eclipse bug.参考编译器(javac来自Oracle JDK)处理你的第一个例子就好了.
| 归档时间: |
|
| 查看次数: |
5836 次 |
| 最近记录: |