Jas*_*Jas 0 java generics java-8
我试过了:
Stream stream = Pattern.compile(" ").splitAsStream(sc.nextLine());
stream.forEach(item) -> {});
Run Code Online (Sandbox Code Playgroud)
得到了:
Compilation Error...
File.java uses unchecked or unsafe operations.
Recompile with -Xlint:unchecked for details.
Run Code Online (Sandbox Code Playgroud)
所以我试过了:
Stream stream = Pattern.compile(" ").splitAsStream(sc.nextLine());
stream.forEach((String item) -> {});
Run Code Online (Sandbox Code Playgroud)
得到了:
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
Run Code Online (Sandbox Code Playgroud)
我怎样才能进行这个.forEach()传递编译?
您已将自定义Stream为原始类型,它会删除所有类型信息和(基本上)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
});
Run Code Online (Sandbox Code Playgroud)
或者更容易,只是内联它:
Pattern.compile(" ").splitAsStream(sc.nextLine()).forEach(item -> {});
Run Code Online (Sandbox Code Playgroud)
或者更容易:
Arrays.stream(sc.nextLine().split(" ")).forEach(item -> {});
Run Code Online (Sandbox Code Playgroud)
虽然更简单,但最后一个版本使用O(n)空间,因为整个输入在forEach()执行第一个之前被拆分.
另一版本使用O(1)的空间,因为在Pattern#splitAsStream()使用Matcher内部迭代通过输入因此消耗在一个时刻的输入匹配.
除非输入很大,否则这种副作用不会产生太大影响.