在Java的API 8说:
在执行管道的终端操作之前,不会开始遍历管道源.
那么为什么以下代码抛出:
java.lang.IllegalStateException:stream已经被操作或关闭
Stream<Integer> stream = Stream.of(1,2,3);
stream.filter( x-> x>1 );
stream.filter( x-> x>2 ).forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)
根据API的第一个过滤操作不应该在Stream上操作.
在Java 8中使用以下简单方法:
public void test(){
Stream<Integer> stream = Stream.of(1,2,3);
stream.map(Integer::toString);
}
Run Code Online (Sandbox Code Playgroud)
我得到两个错误:
java:不兼容类型:无法推断类型变量R(参数不匹配;无效方法引用
对toString的引用在java.lang.Integer中的方法toString(int)和java.lang.Integer中的方法toString()都是不明确的
并且:
无效方法引用非静态方法toString()不能从静态上下文引用
第一个错误是可以理解的,Integer类有两个方法:
public static String toString(int i)
public String toString()
Run Code Online (Sandbox Code Playgroud)
并且编译器无法推断出所需的方法引用.
但是关于第二个问题,编译器引用的静态上下文在哪里?
该错误与Integer类的方法toString()有关,它不是静态的,但为什么我使用map()调用该方法的上下文是静态的?
还有一个问题,如果编译器必须解决导致编译时错误的两种方法之间的歧义,那么他不应该选择另一种吗?
在查看java 8 Time API时,我看到许多方法期望作为参数ChronoUnit(TemporalUnit的实现)在这里,而其他人期望ChronoField(TemporalField的实现)在这里.
当一个方法期望使用ChronoUnit和ChronoField以及它们的区别时,是否有人可以帮助我澄清设计者的决定?
谢谢.
Java 8 Stream API中的collect操作被定义为可以安全地并行执行的可变缩减,即使结果Collection不是线程安全的.
我们可以对Stream.toArray()方法说同样的话吗?
这个方法是一个可变的减少,即使Stream是并行流并且结果数组不是线程安全的,也是线程安全的吗?