在玩Java8的Streams-API时,我偶然发现了以下内容:
要将原始包装器classe对象的数组转换为Stream我只需要调用Stream.of(array).但是要转换原始数据类型的数组,我必须.of(array)从相应的包装器(类)流类调用(< - 听起来很傻).
一个例子:
final Integer[] integers = {1, 2, 3};
final int[] ints = {1, 2, 3};
Stream.of(integers).forEach(System.out::println); //That works just fine
Stream.of(ints).forEach(System.out::println); //That doesn't
IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead
Run Code Online (Sandbox Code Playgroud)
我的问题:
这是为什么?这是否与例如行为Arrays.asList()也适用于包装类数组相关?
Java 8在包中提供了几个功能接口java.util.function.
对于每个基本函数(函数,消费者,谓词,供应商......),还有其他定义的类型参数专用于以下基本类型:double,int,long.
这个问题是关于这种接口的动机:为什么在Java 8中存在像DoubleFunction这样的原始函数
但为什么不覆盖所有原始类型(例如浮点数丢失)?
同样,我们有不同的接口Int*,Double*,Long*对应的Function,Supplier,Predicate.
在我看来,使用这些特殊接口的唯一好处是使代码更具可读性并强制其客户端仅使用该特定类型作为输入.
但除此之外,我是否遗漏了一些其他用例?