美文网首页
为什么Java stream有了map还需要有mapToObj

为什么Java stream有了map还需要有mapToObj

作者: 抬头挺胸才算活着 | 来源:发表于2021-08-20 10:36 被阅读0次
  • 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(" "))

相关文章

网友评论

      本文标题:为什么Java stream有了map还需要有mapToObj

      本文链接:https://www.haomeiwen.com/subject/uqazbltx.html