Very cool, but as someone unfamiliar with scala (and familiar with java) I would really have liked to see java code for those 6 class files. Obviously they would have to have been approximations, but seeing the 6 raw java source files vs. the 1 scala (and the same .class outputs) I feel would have made a very nice comparison. It also would do away with any ambiguity in the verbal description of the congruencies between the two.
This is approximately how the first code block in the OP would look like in Java 5:
import scala.Function1;
import scala.List;
import scala.runtime.RichInt;
class App$ {
public static final App$ MODULE$ = new App$();
public boolean isEven(int i) {
return i % 2 == 0;
}
public boolean isOdd(int i) {
return i % 2 == 1;
}
public void main(String[] args) {
final List<Integer> n = (new RichInt(1)).to(10).toList();
n.filter(new Function1<Integer, Boolean>() {
public Boolean apply(final Integer x) {
return isEven(x);
}
}).flatMap(new Function1<Integer, List<Integer>>() {
public List<Integer> apply(final Integer i) {
return n.filter(new Function1<Integer, Boolean>() {
public Boolean apply(final Integer x) {
return isOdd(x);
}
}).map(new Function1<Integer, Integer>() {
public Integer apply(final Integer j) {
return i * j;
}
});
}
});
}
}
class App {
public static boolean isEven(int i) {
return App$.MODULE$.isEven(i);
}
public static boolean isOdd(int i) {
return App$.MODULE$.isOdd(i);
}
public static void main(String[] args) {
App$.MODULE$.main(args);
}
}
Note that, although anonymous inner classes are valid syntax in Java 5, even in Java 5 they are compiled down to separate class files. Hence 2 classes + 4 anonymous inner classes = 6 class files total.
(The code is only approximate. I haven't tried to compile it, so apologies for any errors.)