Java 8 Streams的简单使用方法

 package JDK8Test;
import java.util.ArrayList; public class Main
{
public static void main(String[] args)
{
ArrayList<Integer> nums=new ArrayList<Integer>();
nums.add(1);
nums.add(null);
nums.add(3);
nums.add(4);
nums.add(null);
nums.add(6);
int n=(int)nums.stream().filter(num->num!=null).count();
System.out.println(n);//
}
}

  上面这段代码是获取一个List中,元素不为null的个数。

  

  

  红色框中的语句是一个Stream的生命开始的地方,负责创建一个Stream实例;绿色框中的语句是赋予Stream灵魂的地方,把一个Stream转换成另外一个Stream,红框的语句生成的是一个包含所有nums变量的Stream,通过绿框的filter方法以后,重新生成了一个过滤掉原nums列表所有null以后的Stream;蓝色框中的语句是丰收的地方,把Stream的里面包含的内容按照某种算法来汇聚成一个值。  

  使用Stream的基本步骤:

  1.创建Stream;

  2.转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换);

  3.对Stream进行聚合操作,获取想要的结果;

  怎么得到Stream:

  ①使用Stream静态方法来创建Stream:

  of方法:有两个重载方法,一个接受变长参数,一个接受单一值 
  Stream integerStream = Stream.of(1, 2, 3, 5);
  Stream stringStream = Stream.of(“taobao”);

  ②通过Collection接口的默认方法stream(),把一个Collection对象转换成Stream。

  转换Stream:

  转换Stream其实就是把一个Stream通过某些行为转换成一个新的Stream。

  ①distinct: 对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法),新生成的Stream中没有重复的元素;

  ②filter: 对于Stream中包含的元素使用给定的过滤函数进行过滤操作,新生成的Stream只包含符合条件的元素;

  

  

  ③map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型。
  

  例子:

 package JDK8Test;
import java.util.*;
import java.util.Arrays;
import java.util.stream.Collectors; public class Main
{
public static void main(String[] args)
{
List<String> list=Arrays.asList(new String[] {"Ni","Hao","Lambda"});
List<String> list2=list.stream().map(item->item.toLowerCase()).collect(Collectors.toList());
System.out.println(list2);
}//[ni, hao, lambda]
}

  这段代码就是对一个字符串的列表,把其中包含的每个字符串都转换成全小写的字符串。注意代码第四行的map方法调用,这里map方法就是接受了一个lambda表达式。

 package JDK8Test;
import java.util.*;
import java.util.Arrays;
import java.util.stream.Collectors; public class Main
{
public static void main(String[] args)
{
List<String> list=Arrays.asList(new String[] {"Ni","Hao","Lambda"});
List<String> list2=list.stream().map(item->{return "lambda:"+item;}).collect(Collectors.toList());
list2.forEach(System.out::println);
}
}
/*
lambda:Ni
lambda:Hao
lambda:Lambda
*/

  集合的forEach()方法,对集合进行遍历,小括号中的方法就是应用到集合中每个元素的身上,以达到遍历的目的。

 package JDK8Test;
import java.util.*;
import java.util.Arrays;
import java.util.stream.Collectors; public class Main
{
public static void main(String[] args)
{
String waibu="lambda:";
List<String> proStrs=Arrays.asList(new String[] {"Ni","Hao","Lambda"});
List<String> exeStrs=proStrs.stream().map(chuandi->{
long zidingyi=System.currentTimeMillis();
return waibu+chuandi+"------:"+zidingyi;
}).collect(Collectors.toList());
exeStrs.forEach(System.out::println);
}
}
/*
lambda:Ni------:1559118070052
lambda:Hao------:1559118070052
lambda:Lambda------:1559118070052
*/

  

  lambda表达式可以访问给它传递的变量,访问自己内部定义的变量,同时也能访问它外部的变量。 不过lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变)。 当在表达式内部修改waibu = waibu + " ";时,IDE就会报错。因为变量waibu被lambda表达式引用,所以编译器会隐式的把其当成final来处理。
  以前Java的匿名内部类在访问外部变量的时候,外部变量必须用final修饰。现在java8对这个限制做了优化,可以不用显示使用final修饰,但是编译器隐式当成final来处理。

  ④peek: 生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;

  

  ⑤limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;

  

  ⑥skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;

  

  汇聚Stream:

  

  汇聚操作(也称为折叠)接受一个元素序列为输入,反复使用某个合并操作,把序列中的元素合并成一个汇总的结果。比如查找一个数字列表的总和或者最大值,或者把这些数字累积成一个List对象。Stream接口有一些通用的汇聚操作,比如reduce()和collect();也有一些特定用途的汇聚操作,比如sum(),max()和count()。注意:sum方法不是所有的Stream对象都有的,只有IntStream、LongStream和DoubleStream实例才有。

  ①reduce():把 Stream 元素组合起来。它提供一个起始值(种子),然后依照运算规则(BinaryOperator),返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值。

  

  ②collect:正如其名字显示的,它可以把Stream中的所有元素收集到一个结果容器中(比如Collection)。

  Java 8还给我们提供了Collector的工具类——Collectors,其中已经定义了一些静态工厂方法,比如Collectors.toCollection()收集到Collection中, Collectors.toList()收集到List中和Collectors.toSet()收集到Set中。
  List numsWithoutNull = nums.stream().filter(num -> num != null).collect(Collectors.toList());

  ③count方法:获取Stream中元素的个数。

  – 搜索相关
  – allMatch:是不是Stream中的所有元素都满足给定的匹配条件
  – anyMatch:Stream中是否存在任何一个元素满足匹配条件
  – findFirst: 返回Stream中的第一个元素,如果Stream为空,返回空Optional
  – noneMatch:是不是Stream中的所有元素都不满足给定的匹配条件
  – max和min:使用给定的比较器(Operator),返回Stream中的最大|最小值
  下面给出allMatch和max的例子:

 package JDK8Test;
import java.util.*; public class Main
{
public static void main(String[] args)
{
ArrayList<Integer> nums=new ArrayList<Integer>();
nums.add(1);
nums.add(null);
nums.add(3);
nums.add(4);
nums.add(null);
nums.add(6);
System.out.println(nums.stream().filter(item->item!=null).allMatch(item->item<100));
}
}
/*
true
*/

  以上代码,判断nums列表里的不为null元素是否都满足“小于100“这个条件,输出为true。

 package JDK8Test;
import java.util.*; public class Main
{
public static void main(String[] args)
{
ArrayList<Integer> nums=new ArrayList<Integer>();
nums.add(1);
nums.add(null);
nums.add(3);
nums.add(4);
nums.add(null);
nums.add(6);
nums.stream().filter(item->item!=null).max((o1,o2)->o1-o2).ifPresent(System.out::println);
}
}
/*
6
*/

  以上代码,先把nums里为null的元素过滤掉,然后输出nums里元素的最大值。输出为6。

  

Java 8 Streams的简单使用方法的更多相关文章

  1. Ubuntu 14.04 Sublime Text3 Java编译运行(最简单的方法)

    Sublime,结果发现只能编译,无法直接运行,于是就在网上搜解决方法,发现大部分方法都是告诉你要进入Java.sublime-packag这个文件,然后再修改JavaC.sublime-build, ...

  2. Java并发编程基础--基本线程方法详解

    什么是线程 线程是操作系统调度的最小单位,一个进程中可以有多个线程,这些线程可以各自的计数器,栈,局部变量,并且能够访问共享的内存变量.多线程的优势是可以提高响应时间和吞吐量. 使用多线程 一个进程正 ...

  3. js,java,浮点数运算错误及应对方法

    js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...

  4. java内省机制及PropertyUtils使用方法

    背景 一般情况下,在Java中你可以通过get方法轻松获取beans中的属性值.但是,当你事先不知道beans的类型或者将要访问或修改的属性名时,该怎么办?Java语言中提供了一些像java.bean ...

  5. 计算机网络(13)-----java nio手动实现简单的http服务器

    java nio手动实现简单的http服务器  需求分析 最近在学习HTTP协议,还是希望动手去做一做,所以就自己实现了一个http服务器,主要功能是将http请求封装httpRequest,通过解析 ...

  6. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  7. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  8. Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  9. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

随机推荐

  1. Docker工具

    虚拟化 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源, 如服务器.网络.内存及存储等,予以抽象.转换后呈现出来, 打破实体结构间的 ...

  2. Linux学习-工作管理 (job control)

    什么是工作管理? 进行工作管理的行为中, 其实每个工作都是目前 bash 的 子进程,亦即彼此之间是有相关性的. 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 b ...

  3. Linux学习-什么是例行性工作排程

    那么 Linux 的例行性工作是如何进行排程的呢?所谓的排程就是将这些工作安排执行的流程之意! 咱们的 Linux 排程就是透过 crontab 与 at 这两个东西! Linux 工作排程的种类: ...

  4. C语言高效编程的几招,你会了几招了?

    编写高效简洁的C 语言代码,是许多软件工程师追求的目标.本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教. 第1 招:以空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个 ...

  5. HDU 5238 Calculator 线段树 中国剩余定理

    题意: 给一个计算器,有一系列计算步骤,只有加,乘,幂三种运算. 有一种查询操作:查询初始值为\(x\)的时候,最终运算结果模\(29393\)的值. 有一种修改操作:可以修改第\(p\)个运算的运算 ...

  6. 《Scrum实战》第1次课课后任务

    1.必做任务:从知行角度总结T平台 从知行角度总结T平台 头(知识,学习) 做得好的 宣贯会 引入敏捷思想 敏捷宣言 敏捷原则 质量风险前移原则 引入最佳实践 包括了XP的大部分实践 不足 项目管理框 ...

  7. LoadRunner 11破解方法

    名称:HP Loadrunner Software 11.00 版本号:11.00.0.0 安装环境:Win 7 软件安装成功后,会弹出提示告知license的有效期为10天. 破解方法: 1.下载破 ...

  8. ant 入门级详解

    ant 入门级详解   [转载的地址(也是转载,未找到原文地址)]https://www.cnblogs.com/jsfx/p/6233645.html 1,什么是antant是构建工具2,什么是构建 ...

  9. 使用Gson解析JSON数据

    本文使用gson对json进行解析处理 首先,下载gson包 ,本文使用(gson-1.6.jar) package com.whroid.java.json; import com.google.g ...

  10. 一句话配置mongodb

    一.安装mongodbmongodb-win32-x86_64-2008plus-ssl-3.2.9-signed.msi 二.以管理员身份,启动cmd命令mongod.exe --logpath & ...