我试过了:
Stream stream = Pattern.compile(" ").splitAsStream(sc.nextLine()); stream.forEach(item) -> {});
得到了:
Compilation Error... File.java uses unchecked or unsafe operations. Recompile with -Xlint:unchecked for details.
所以我试过了:
Stream stream = Pattern.compile(" ").splitAsStream(sc.nextLine()); stream.forEach((String item) -> {});
得到了:
Compilation Error... 15: error: incompatible types: incompatible parameter types in lambda expression stream.forEach((String item) -> {}); ^ Some messages have been simplified; recompile with -Xdiags:verbose to get full output 1 error
我怎样才能进行这个.forEach()
传递编译?
您已将自定义Stream
为原始类型,它会删除所有类型信息和(基本上)Object
用作类型.
试试这个:
Streamstream = Pattern.compile(" ").splitAsStream(sc.nextLine()); // ^----^ add a generic type to the declaration stream.forEach(item -> { // item is know to be a String });
或者更容易,只是内联它:
Pattern.compile(" ").splitAsStream(sc.nextLine()).forEach(item -> {});
或者更容易:
Arrays.stream(sc.nextLine().split(" ")).forEach(item -> {});
虽然更简单,但最后一个版本使用O(n)空间,因为整个输入在forEach()
执行第一个之前被拆分.
另一版本使用O(1)的空间,因为在Pattern#splitAsStream()
使用Matcher
内部迭代通过输入因此消耗在一个时刻的输入匹配.
除非输入很大,否则这种副作用不会产生太大影响.