-
Java的stream除了有常见的泛型Stream,还有IntStream、LongStream、DoubleStream等
后者可以在stream中使用原始的数据类型 -
两者的map函数
泛型Stream的map相对比较简单,只有下面一个
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
整形Stream的map
int到int:IntStream map(IntUnaryOperator mapper);
其中int applyAsInt(int operand);
int到Object:<U> Stream<U> mapToObj(IntFunction<? extends U> mapper); -
<R> Stream<R> map(Function<? super T, ? extends R> mapper)解析
首先明确泛型的赋值只能是 父类(抽象) = 子类(具体)
Function<? super T, ? extends R> 是 R apply(T t);
我们先看看? extends R,因此map返回的是Stream<R>,因此map先new一个Stream<R>,在把?赋值给Stream<R>,那么?是在赋值表达式的右边,因此?只能是R的子类,所以有? extends R
接着我们看看? super T,mapper的输入类型是?,实际输入是固定的T,因为我们的Stream<T>已经固定了,T是赋值给?的,因此?要是父类。
综上,如果一个函数的定义输出是R,那么其实际类型可以是? extends R;
如果一个函数的实际输入是T,那么其定义的类型可以是? extends T;
函数的输入参数是被赋值的(赋值表达式左边),函数的输出参数是赋值的(赋值表达式右边)
- 转化
mapToInt和mapToObj
Stream Integer转化为int数组,需要先用mapToInt转化为IntStream
int [] ints = list.stream().mapToInt(Integer::intValue).toArray();
根据以上知识,我们可以得到下面的结论
- 整形数组在做很多操作之前要先boxed或者mapToObj
整形数组转化为列表,需要先包装boxed
Arrays.stream(nums).boxed().collect(Collectors.toList())
Arrays.stream(buff).mapToObj(String::valueOf).collect(Collectors.joining(" "))
网友评论