JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样?

代码:List<String> list = new ArrayList<>();

list.add("1");

list.add("2");

list.add("3");

list.add("4");

list.add("5");

for(String s:list){

System.out.println(s);

}

这样?

代码:

List<String > list = new ArrayList<>();

list.add("1");

list.add("2");

list.add("3");

list.add("4");

list.add("5");

for(int i=0;i<list.size();i++){

System,out.println(list.get(i));

}

Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等本篇只举例list和map, 为了便于理解, 我们先创建一个数据类
PS:为了解决屏幕空间, 注释不标准, 请忽略

首先我们操作list

1.遍历所有人员的名字

代码:

personList.stream().forEach(person -> System.out.println(person.getName()));

2.过滤年龄大于12的

代码:

personList.stream().filter(person ->person.getAge >=12).forEach(person -> System.out.println(person.getAge()));

3.过滤年龄大于12的总人数

代码:

long count = personList.stream().filter(person -> person.getAge() >= 12).count());

System.out.printf("总人数:$s",count);

4.根据年龄排序

代码:

List<Person> list = personList.stream().sorted(Comparator.comparingInt(Person::getAge)).collect(Collectors.toList());

list.forEach(p -> System.out.printf("姓名:$s,年龄:$s",p.getName(),p.getAge()));

5.获得年龄最小的

6.年龄最大的

7.将所有的名字打印出来并用逗号隔开

8.所有人年龄的总和

9.关于统计类 IntSummaryStatistics

关于Map中Stram的操作

1.list转map

2.在转换过程中, key重复的情况的处理方式

(key1,key2) -> key2是一种表达式, 表示转换map时,如果有两个相同的key,

则取后面的key2替换前面的key1,key1,key2两个关键字可以随意修改.

3.key重复时,将前面的value和后面的value相加

小结:

先说下Stream的优势:它是java对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源。同时支持函数式编程,代码非常简洁。

  Stream是一种用来计算数据的流,它本身并没有存储数据。你可以认为它是对数据源的一个映射或者视图。

  它的工作流程是:获取数据源->进行一次或多次逻辑转换操作->进行归约操作形成新的流(最后可以将流转换成集合)。

Stream的特性

1.中间操作惰性执行:一个流后面可以跟随0到多个中间操作,主要目的是打开流,并没有真正的去计算,而是做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历,并没有消耗资源。

还有多个中间操作的话,这里的时间复杂度并不是n个for循环,转换操作都是 lazy 的,多个转换操作只会在 Terminal 操作的时候融合起来,一次循环完成。可以这样简单的理解,Stream 里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在Terminal操作的时候循环 Stream 对应的集合,然后对每个元素执行所有的函数。

2.流的末端操作只能有一次:当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。之后如果想要操作就必须新打开流。

关于流被关闭不能再操作的异常:

这里曾经遇到过一个错误:stream has already been operated upon or closed

意思是流已经被关闭了,这是因为当我们使用末端操作之后,流就被关闭了,无法再次被调用,如果我们想重复调用,只能重新打开一个新的流.

java8之stream和lambda表达式的更多相关文章

  1. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  2. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  3. 【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?

    写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备 ...

  4. 初识Stream API + Lambda表达式

    使用新特性简化代码,增强可读性 package com.gg.java8; import java.util.*; import org.junit.Test; public class TestLa ...

  5. 无情的Java 8 之 Stream和lambda表达式篇

    不好意思,最近刷小视频刷的有点上头 看到这图就不自觉的要来一句:"卧槽,无情" 好了,我要开始正经了 JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样 ...

  6. 5万字长文:Stream和Lambda表达式最佳实践-附PDF下载

    目录 1. Streams简介 1.1 创建Stream 1.2 Streams多线程 1.3 Stream的基本操作 Matching Filtering Mapping FlatMap Reduc ...

  7. Java8特性详解 lambda表达式 Stream

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

  8. Java8特性详解 lambda表达式 Stream【转】

    本文转自http://www.cnblogs.com/aoeiuv/p/5911692.html 1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有 ...

  9. Java8函数式接口以及lambda表达式实践

    罗列一下遇到可以转换成lamada表达式的场景,仅供参考,如有更好的方式,欢迎在评论区留言. 1.计算订单总金额 订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下 BigDec ...

随机推荐

  1. hive单用户多点模式配置

    简介 单用户多点模式也称远程服务模式,用户非java客户端访问元数据库,在服务端启动MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库. mysq ...

  2. Spring boot之使用thymeleaf

    操作步骤 (1)在pom.xml中引入thymeleaf; (2)如何关闭thymeleaf缓存 (3)编写模板文件.html (4)编写访问模板文件controller 在pom.xml中引入thy ...

  3. TensorFlow线性回归

    目录 数据可视化 梯度下降 结果可视化 数据可视化 import numpy as np import tensorflow as tf import matplotlib.pyplot as plt ...

  4. node 常用模块

    像在服务器上的操作,我们只要 require 引入的模块,只要不是 nodejs 中的模块,我们的下载环境都是开发环境 配置自动化:引用插件 nodemon 下载:npm i nodemon -g  ...

  5. track-by的使用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. nodejs之路由

    声明:在写nodejs代码的时候,很多模块可以封装保存起来,以后的项目都会用到. 1.路由模块 var url=require('url'); //封装方法改变res 绑定res.send() fun ...

  7. linux(centOS7)的基本操作(五) 磁盘、分区、挂载、卸载

    linux的磁盘类型和分区简介 linux的磁盘分为IDE和SCSI,目前以后者居多. 1. IDE磁盘的分区:hd+盘号+分区数字 盘号 |-a:基本盘 |-b:基本从属盘 |-c:辅助主盘 |-d ...

  8. 【HANA系列】SAP Vora(SAP HANA和Hadoop)简析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP Vora(SAP HAN ...

  9. 应用安全 - 免杀 - 工具 - the-backdoor-factory - 使用|命令 - 汇总

    安装 Kali下方式一: git clone https://github.com/secretsquirrel/the-backdoor-factory方式二: apt-get install ba ...

  10. openvswitch安装与使用

    wget http://openvswitch.org/releases/openvswitch-2.4.1.tar.gz tar -xvf openvswitch-2.4.1.tar.gz cd o ...