我试过了:
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()
传递编译?
答案 0 :(得分:6)
您已将Stream
定义为raw类型,该类型会删除所有类型信息,并且(基本上)使用Object
作为类型。
试试这个:
Stream<String> stream = 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
来迭代输入,因此一次消耗输入匹配。
除非输入很大,否则这种副作用不会产生太大的影响。