学习Java8中的Stream (一)起步

栏目: Java · 发布时间: 8年前

内容简介:学习Java8中的Stream (一)起步

不想再用for嵌套for操作了,java8 带来了新的API —— Stream,非常强大!

Stream中文翻译成流,是一个支持串行和并行操作元素的序列,也是Lambda表达式配合使用的强大工具。

源码在java.util.stream中,感兴趣可以阅读阅读。

学习 <a href='https://www.codercto.com/topics/22013.html'>Java</a> 8中的Stream (一)起步

0x00 java8 中的流是什么

在编程中,对一串数据进行0个或者多个中间操作后,最后再获得结果。这个操作在没有流的情况下一般会涉及到多次循环,这是非常低效的。

流是为了处理一串数据(sequence),而不需要多次循环的一种方式。

流在操作序列的时候,会将数据放在一个叫Stream Pipeline的地方,这个地方会有三部分

  • 源(一般为集合)
  • 0或多个中间操作 (一般为惰性操作,不会直接操作数据)
  • 终止操作 (一般为求最终值,这时流的整个流程结束)

流支持并行操作,而迭代器,for循环都是串行操作,所以流在多核处理上有强大优势。

学习Java8中的Stream (一)起步

1x00 Stream的类型和创建方式

  • 创建流

    // 从数组创建
            int [] source = {1,2,3,4,5,6};
            IntStream s = Arrays.stream(source);
    // 从集合创建
            List list = Arrays.asList(1,2,3,4,5);
            Stream s2 = list.stream();
    // 创建1到10的流
            IntStream s3 = IntStream.range(1,10);
    // 直接创建
            Stream s4 = Stream.of("wo", "ai", "?")
    
  • 其他流

    此外,流还提供了几种包装好的流:

    // 支持串行并行操作的序列,元素只有double类型的流
    DoubleStream
    
// 支持串行并行操作的序列,元素只有int类型的流
IntStream
// 支持串行并行操作的序列,元素只有long类型的流
LongStream

2x00 常用的流方法

这里不过多提及,最好看一看API文档,我这里举一些常用的例子

// (惰性操作)中间操作,遍历
Stream<T> map(Function<? super T,? extends R> mapper)

// (及早求值操作)终止操作,遍历
void forEach(Consumer<? super T> action)

例子:

// 将元素的平方打印出来
int[] nums = {2,3,4,5,6};
Arrays.stream(nums)
    .map(i->i*i)
    .forEach(System.out::println);

学习Java8中的Stream (一)起步

// 将元素中的所有偶数累加求和
int[] nums = {2, 3, 4, 5, 6};
System.out.println(
        Arrays.stream(nums)
                .map(i -> i % 2 == 0 ? i : 0)
                .reduce(0, Integer::sum)
);

学习Java8中的Stream (一)起步

// flatMap处理嵌套的list
        List<List<Integer>> ll =
                Arrays.asList(
                        Arrays.asList(1, 2, 3),
                        Arrays.asList(11, 22, 33),
                        Arrays.asList(0xF1, 0xF2, 0xF3)
                );

        ll.stream()
                .flatMap(list -> list.stream())
                .map(i -> 2 * i)
                .forEach(i -> System.out.println(i));

学习Java8中的Stream (一)起步

假设有N条营业数据,前5条是无关的测试数据,中间10条是要参加考核的,参与考核的需要知道其中超过50w(包括50)的数据的交易额平均值,其他不参与考核的忽略。

测试数据如下:

{11, 9, 2, 13, 1, 2, 99, 54, 23, 66, 70, 23, 46, 50, 100, 10, 24, 18, 19, 2};

  Stream<Integer> trans = Stream.of(11, 9, 2, 13, 1, 2, 99, 54, 23, 66, 70, 23, 46, 50, 100, 10, 24, 18, 19, 2);

        IntSummaryStatistics all = trans
// 前5条跳过,2, 99, 54, 23, 66, 70, 23, 46, 50, 100, 10, 24, 18, 19, 2
                .skip(5)
// 取10条考核交易 2, 99, 54, 23, 66, 70, 23, 46, 50, 100
                .limit(10)
// 将50以下的交易剔除 99, 54, 66, 70, 50, 100
                .filter(i -> i >= 50)
// 转换成数字。如果是IntStream 则不需要转换
                .mapToInt(i->i)
// 将流的统计结果放入包装对象中
                .summaryStatistics();
// 交易总量 439w,平均值为439/6
        System.out.println(all.getAverage());

学习Java8中的Stream (一)起步

以上为流的一些基础使用方法。后续会有一些详细的补充,容我先留个坑。

分割线

3x00 流的特性

  • 基于集合或者序列
  • 流不存储值,也不能重复使用,数据通过管道的方式进行操作
  • 每个操作都是函数式的,对流的操作不会影响源数据
  • 多数操作(排序,映射,过滤等),可以延迟实现

基于集合和序列就不写例子了,不存储值也是一个概念,下面验证一些流不能重复使用。

#####3x01 不能重复使用

Stream<Integer> trans = Stream.of(11, 9, 2);
trans.forEach(i -> System.out.println(i));
trans.reduce(0, Integer::sum);

当我第二次使用trans时,报错了。

学习Java8中的Stream (一)起步

流只能使用一次,无法重复使用

3x02 验证流延迟操作

流只要在终止操作(及早求值)时,才会对数据统一做操作,在没有遇到求值操作的时候,惰性操作代码不会被执行。

Stream<Integer> trans = Stream.of(11, 70, 23, 46, 50, 100, 10, 24, 18, 19, 2);
trans.map(i->{
    System.out.println(i);
    return i;
});

学习Java8中的Stream (一)起步

3x02 不影响源数据

可以创建一个List去实践,这里不写代码,当流执行完成之后,源List的数据是不会发生变化的

大家可以自己实践一下

by:Zing

转载请注明出处:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spring in Action

Spring in Action

Craig Walls / Manning Publications / 2011-6-29 / USD 49.99

Spring in Action, Third Edition has been completely revised to reflect the latest features, tools, practices Spring offers to java developers. It begins by introducing the core concepts of Spring and......一起来看看 《Spring in Action》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具