这编译得很好,但在运行时会爆炸:
线程“主”java.lang.NoSuchMethodError 中的异常:scala.collection.immutable.List.filter(Lscala/Function1;)Lscala/collection/immutable/List
import scala.Function1;
import scala.collection.immutable.List;
import scala.collection.immutable.Nil$;
import scala.runtime.AbstractFunction1;
public class FunProc {
List nil = Nil$.MODULE$; // the empty list
List<Integer> list1 = nil.$colon$colon(1); // append 1 to the empty list
List<Integer> list2 = list1.$colon$colon(2); // append 2 to List(1)
List<Integer> list3 = list2.$colon$colon(3).$colon$colon(14).$colon$colon(8); // List(8, 14, 3, 2, 1)
Function1<Integer, Object> filterFn = new AbstractFunction1<Integer, Object>() {
public Boolean apply(Integer value) { return value<10; }
};
List<Integer> list4 = list3.filter(filterFn); // List(8, 3, 2, 1)
public void doIt() {
System.out.println("Filtered List is " + list4);
}
}
编辑
在尝试了 idonnie 的答案后,我想出了这个:
List<Integer> list4 = list3.toTraversable().filter(filterFn).toList();
这与 idonnie 的答案基本相同,只是使用了转换而不是转换。我仍然想知道为什么 toTraversable() 是必要的,因为以下编译得很好:
List<Integer> list4 = list3.filter(filterFn);