如何为lambda表达式指定类型?

时间:2017-01-15 17:26:00

标签: java generics java-8

我试过了:

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()传递编译?

1 个答案:

答案 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来迭代输入,因此一次消耗输入匹配。
除非输入很大,否则这种副作用不会产生太大的影响。