Java8——Stream流的使用(特性化操作)

集合中只能存储对象,对于基本类型也会涉及到拆装箱操作。而在上面的归纳操作中,比如对于数值的求和、求差等操作,实际上也涉及到基本类型的自动拆箱和装箱的操作,因为Stream内部也是以对象类型存储数据的。另外对于一些简单的操作求和求最值操作Stream并没有提供现成的API,主要是因为Stream面向全部类型,如果是普通对象类型那肯定不能求和或者求最值的。

  集合中只能存储对象,对于基本类型也会涉及到拆装箱操作。而在上面的归纳操作中,比如对于数值的求和、求差等操作,实际上也涉及到基本类型的自动拆箱和装箱的操作,因为Stream内部也是以对象类型存储数据的。另外对于一些简单的操作求和求最值操作Stream并没有提供现成的API,主要是因为Stream面向全部类型,如果是普通对象类型那肯定不能求和或者求最值的。
  Java8有什么改进吗?当然有,Java8为我们提供了基于Stream的三个特性化流IntStream、LongStream、DoubleStream,它们只接受指定类型的数据,底层基于基本类型,直接操作基本类型,避免了拆装箱操作的性能开销,并且提供了sum、min等快捷归纳的方法!实际上Stream的count方法内部就是先将对象流转换为LongStream数值流,然后调用sum方法。

  Stream流转换特性化流的方法如下,这些方法都是中间操作:

IntStream mapToInt(ToIntFunction<? super T> mapper)

  返回一个IntStream ,其中包含将给定函数应用于此流的元素的结果。

LongStream mapToLong(ToLongFunction<? super T> mapper)

  返回一个LongStream ,其中包含将给定函数应用于此流的元素的结果。

DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper)

  返回一个DoubleStream ,其中包含将给定函数应用于此流的元素的结果。

  特性化流除了包含Strean的大部分方法之外,特有的一些常用方法如下,以IntStream为例子:

< U > Stream< U > mapToObj(IntFunction<? extends U> mapper)

  返回一个对象值Stream ,其中包含将给定函数应用于此流的元素的结果。该方法将特性化流转换为对象流。

Stream< Integer > boxed()

  对每个元素进行装箱操作,返回一个Stream< Integer >。该方法将特性化流转换为对象流。

OptionalDouble average()

  返回此流的元素的算术平均值的OptionalDouble,如果此流为空,则返回一个空的OptionalDouble。

OptionalInt max()

  返回此流的最大元素的OptionalInt,如果此流为空,则返回一个空的OptionalInt。

OptionalInt min()

  返回此流的最小元素的OptionalInt,如果此流为空,则返回一个空的OptionalInt。

long count()

  返回此流中的元素数。

static IntStream range(int startInclusive,int endExclusive)

  返回有序的IntStream,范围是[startInclusive endExclusive)。

static IntStream rangeClosed(int startInclusive,int endInclusive)

  返回有序的IntStream,范围是[startInclusive endInclusive]。

  相应的,Optional也有三个对应的特性化类OptionalInt、OptionalLong、 OptionalDouble,同样避免了拆装箱操作,他们的方法和Optional都差不多,但是不接受null元素。

使用案例:

/**
 * @author lx
 */
public class Specialtest {
    @Test
    public void test() {
        //求和
        System.out.println(Stream.of(1, 2, 3, 4, 7).mapToInt(x -> x).sum());
        //求最大值
        Stream.of(1, 2, 3, 4, 7).mapToInt(x -> x).max().ifPresent(System.out::println);
        //求最小值
        Stream.of(1, 2, 3, 4, 7).mapToInt(x -> x).min().ifPresent(System.out::println);
        //求算术平均数
        Stream.of(1, 2, 3, 4, 7).mapToInt(x -> x).average().ifPresent(System.out::println);
    }
}

  • 发表于 2020-09-16 16:10
  • 阅读 ( 14 )

0 条评论

请先 登录 后评论
NX小编
NX小编

973 篇文章

作家榜 »

  1. NX小编 973 文章
  2. 58沈剑 309 文章
  3. 奈学教育 131 文章
  4. 李希沅 | 奈学教育 27 文章
  5. 江帅帅 | 奈学教育 24 文章
  6. 林淮川 | 奈学教育 12 文章
  7. 科技热点 10 文章
  8. 邱鹏超 2 文章