学习Java8中的Stream (一)起步

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

内容简介:学习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

转载请注明出处:


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

查看所有标签

猜你喜欢:

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

艾伦•图灵传

艾伦•图灵传

(英)安德鲁·霍奇斯 / 孙天齐 / 湖南科学技术出版社 / 2012-8-1 / 68.00元

《艾伦·图灵传:如谜的解谜者》是图灵诞辰100周年纪念版,印制工艺更为精美。本书是世界共认的最权威的图灵传记。艾伦?图灵是现代人工智能的鼻祖,在24岁时奠定了计算机的理论基础。二战期间,他为盟军破译密码,为结束战争做出巨大贡献。战后,他开创性地提出人工智能的概念,并做了大量的前期工作。因同性恋问题事发,被迫注射激素,后来吃毒苹果而死。作者是一名数学家,也是一名同性恋者。他对图灵的生平有切身的体会,......一起来看看 《艾伦•图灵传》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试