文档章节

Lambda表达式-聚合操作

o
 osc_n6euf5h6
发布于 2019/03/19 18:45
字数 855
阅读 7
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

文章参考自博客:https://www.cnblogs.com/franson-2016/p/5593080.html

以及学习网站:how2java.cn

 

1.传统方式和聚合操作遍历数据的不同

传统遍历List的方式如下:

for(Hero h:list){
            if(h.getAge()>50 && h.getId()<400)
                System.out.println(h.getName());
        }

而使用了聚合操作的方式如下:

list
                .stream()
                .filter( h-> h.getAge()>50 && h.getId()<400)
                .forEach(h-> System.out.println(h.getName()));

 

2.Stream(流)是什么?

    Stream是对集合的包装,通常和lambda一起使用。 使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。 同样,Stream使用懒运算,他们并不会真正地读取所有数据,遇到像getFirst() 这样的方法就会结束链式语法。

   Stream和Collection结构化的数据不同,Stream有一系列的元素

   管道指的是一系列的聚合操作的总和

   管道由三部分组成:管道源中间操作结束操作   

   

(1)管道源: 其可以是一个集合,一个数组,一个生成器函数或一个I / O通道

//管道源是一个集合
        list
                .stream()
                .forEach(h-> System.out.println(h.getName()));

       
//管道源是一个数组
        Hero array[] = list.toArray(new Hero[list.size()]);

        Arrays.stream(array)
                .forEach(h-> System.out.println(h.getName()));

(2)零个或多个中间操作:  每个中间操作会返回一个流,如filter,中间操作时懒操作,不会真正遍历

         中间操作有很多种,主要分为两种:

         1.对元素进行筛选:filter(匹配),distinct(去除重复),sorted(自然排序)

                                         sorted(Comparator)(指定排序),limit(保留),skip(忽略)

         2.转为其他形式的流:mapToDouble(转为double的流), map(转换为任意类型的流)

 

(3)结束操作:  例如forEach,会返回非流结果,例如基本类型的值(int,float,double)、对象或者集合,或者在终端操作为forEach的情况下没有返回值。

          结束操作时才真正进行遍历行为,前面的中间操作也在这个时候真正的执行。

          常见的结束操作如下:

            forEach()(遍历每个元素),toArray()(转换为数组),min(Comparator)(取最小的元素)

            max(Comparator)(取最大的元素),count()(总数),findFirst()(第一个元素)

            

3.具体用例

        首先创建一个100个元素的表,用随机数填充其年龄和ID

Random r = new Random(System.currentTimeMillis());
        List<Hero> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add(new Hero("hero-"+i,r.nextInt(500),r.nextInt(100)));
        }

然后执行各种中间操作:

//用filter筛选满足条件的对象,并进行操作
        list
                .stream()
                .filter(h-> h.getId()<300 && h.getAge()>50)
                .forEach(h-> System.out.println(h));

        //用distinct去除重复元素
        list
                .stream()
                .distinct()
                .forEach(h-> System.out.print(h));

        //用sorted进行排序
        list
                .stream()
                .sorted((h1,h2) -> h1.getAge()>h2.getAge() ? 1:-1)
                .forEach(h-> System.out.println(h));

        //用limit保留三个元素
        list
                .stream()
                .limit(3)
                .forEach(h-> System.out.println(h));

        //用skip忽略前三个元素
        list
                .stream()
                .skip(3)
                .forEach(h-> System.out.println(h));

        //用mapToDouble转换为Double的Stream
        list
                .stream()
                .mapToDouble(Hero::getAge)
                .forEach(h-> System.out.println(h));

        //转换为任意类型的Stream
        list
                .stream()
                .map((h)-> h.getName()+"-"+h.getAge()+"-"+h.getId())
                .forEach(h-> System.out.println(h));

 

终端操作(结束操作)的用例如下:

//用forEach遍历集合
        list
                .stream()
                .forEach(h-> System.out.println(h));

        //用toArray将表变为数组
        Object[] arrays = list
                .stream()
                .toArray();

        //用min得到最小值
        Hero h1 = list
                .stream()
                .min((hf,hs)->hf.getAge()-hs.getAge())
                .get();

        //用max得到最大值
        Hero h2 =list
                .stream()
                .max((hf,hs) -> hf.getAge()-hs.getAge())
                .get();

        //用count计算流中的数据总数
        long count = list
                .stream()
                .count();

        //用findFirst得到第一个元素
        Hero h3 = list
                .stream()
                .findFirst()
                .get();
    

 

测试用例:

Hero h = list
                .stream()
                .sorted((h1,h2)-> h1.getAge()>h2.getAge() ? -1:1)
                .skip(2)
                .findFirst()
                .get();

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Lambda表达式

Lambda表达式 匿名类的一个问题是,如果匿名类的实现非常简单,例如只包含一个方法的接口,那么匿名类的语法可能看起来不实用且不清楚。在这些情况下,您通常会尝试将功能作为参数传递给另一...

蓝天之上
2018/07/17
5
0
聚合操作

聚合操作 注意:为了更好地理解本节中的概念,请查看 Lambda表达式和 方法引用部分。 你用什么收藏品?您不是简单地将对象存储在集合中并将它们保留在那里。在大多数情况下,您使用集合来检索...

嘿嘿_
2018/09/20
0
0
我的Lambda的学习笔记

前述   Lambda表达式是 Java 8 的新特性。许多语言都有 Lambda 的特性。   因此使用的 Java 环境一定要 8 以上的环境。 Lambda   到底什么是 Lambda 表达式呢?     Lambda 表达式...

osc_86eb7mly
2019/02/12
1
0
java8新特性的介绍

什么是Stream   Stream是一个来自数据源的元素队列并可以进行聚合操作。    数据源:流的来源。 可以是集合,数组,I/O channel, 产生器generator 等    聚合操作:类似SQL语句一样的...

osc_ovdqjt64
2019/08/26
0
0
java集合框架之聚合操作stream

参考http://how2j.cn/k/collection/collection-aggregate/702.html#nowhere 聚合操作 JDK8之后,引入了对集合的聚合操作,可以非常容易的遍历,筛选,比较集合中的元素。 像这样: String n...

osc_dp4o1kdn
2018/05/25
4
0

没有更多内容

加载失败,请刷新页面

加载更多

java架构师成长路线-高并发网络编程的分类

鲁班学院java架构师成长路线 随着互联网时代的到来,高并发网络编程这一新鲜名词早已跃然于纸上,为了满足大众眼光的需求,我为大家找了些关于高并发网络编程方面的资料,本文便来介绍高并发...

osc_o494ayqf
14分钟前
0
0
python dict乱码如何解决

定义字典并直接输出,结果输出结果中文是乱码展示 d={'name':'lily','age':18,'sex':'女','no':1121}print d 输出结果: {'age': 18, 'no': 1121, 'name': 'lily', 'sex': '\xe5\xa5\xb3'}...

osc_9mjo6c4e
15分钟前
7
0
硬肝50天,18w字的实战编程资料《重学Java设计模式》终于 出炉了

沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 作者从5月20日那天投身实战型设计模式打磨,通过模拟互联网业务开发实际需求作为学习场景,讲解设计模式。 全书共计22个真实业务场景...

osc_zls6dx9i
17分钟前
20
0
怎么才能让Spring AOP有最大的作用--乐字节java

Spring AOP 日志处理带来的问题 我们有一个Pay(接口) 然后两个实现类DollarPay和RmbPay,都需要重写pay()方法, 这时我们需要对pay方法进行性能监控,日志的添加等等怎么做? 最容易想到的方法...

osc_sb30h1xb
18分钟前
10
0
Python 实现将numpy中的nan和inf,nan替换成对应的均值

nan:not a number inf:infinity;正无穷 numpy中的nan和inf都是float类型 t!=t 返回bool类型的数组(矩阵) np.count_nonzero() 返回的是数组中的非0元素个数;true的个数。 np.isnan() 返回b...

osc_sfl7wfr9
20分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部