I read the recently released Java 8 in action and found that there is a piece of code inserted from chapter 5 that is not compiled:
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());
Eclipse says: "Type of mismatch: cannot be converted from List<Object> to List<int[]> "
And after comparing with what the author of Github gave, the following compiled:
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());
The only change is from "j" to "(Integer j)".
But is not the first version fully equivalent to the second with syntactic sugar provided by Java 8? Why does Java refuse to compile it?
thanks
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)
java lambda java-8
Tony lang
source share