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. python之自定义排序函数sorted()

    sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面, ...

  2. Java-basic-2-

    接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类. 如果一个类定义在某个包中,那么package语句应该在源文件的首行. 如果源文件包含import语句,那么应该放在package语句和 ...

  3. stm32独立看门狗实验

    //ALIENTEK Mini STM32开发板V1.9范例代码5//独立看门狗实验//正点原子@ALIENTEK//技术论坛:www.openedv.com STM32F103RBT6属于中容量版本 ...

  4. UVALive - 3942 Remember the Word (Trie + DP)

    题意: 给定一篇长度为L的小写字母文章, 然后给定n个字母, 问有多少种方法用这些字母组成文章. 思路: 用dp[i]来表达[i , L]的方法数, 那么dp[i] 就可以从dp[len(x) + i ...

  5. 大家好,我是一个JAVA初学者,想在这里记下自己学习过程中的点点滴滴,请多多关照

    大家好,我是一个JAVA初学者,想在这里记下自己学习JAVA的点点滴滴,请多多关照. 以前一直在QQ空间里记录的,但感觉有些麻烦,而且有些东西自己理解的并不完善甚至都不正确,现在开始在这里重新记录,从 ...

  6. 使用MeidaStore.Audio获得手机中的音频文件

    MediaStore是安卓系统自带的多媒体系统数据库,他在每次开机时刷新一次,可以通过Cursor这个类对数据库进行访问与修改,修改之后需用广播强制刷新. 使用Cursor必须通过Context获得C ...

  7. Educational Codeforces Round 2 Edge coloring of bipartite graph

    题意: 输入一个二分图,用最少的颜色数给它的每条边染色,使得同一个顶点连的边中颜色互不相同. 输出至少需要的颜色数和任意一种染色方案. 分析: 证明不会,只说一下(偷瞄巨巨代码学到的)做法. 假设点的 ...

  8. 两种图片延迟加载的方法总结jquery.scrollLoading.js与jquery.lazyload.js

    估计网上能查到的最多的两种图片延迟加载方法就是jquery.scrollLoading.js与jquery.lazyload.js了,其中jquery.lazyload.js的调用方法因为有网友爆出的 ...

  9. Struts2报错:No result defined for action xxx and result input

    case如下: 1. 后台程序要升级, 修改了一些功能,但是没有修改或者添加action的参数. 2. 数据库需要升级,执行了一些sql,修改过action的值. 3. 当修改某个已经存在的记录,然后 ...

  10. 装箱I(01背包)

    描述 给两个有一定容量的箱子,往里面装宝石(宝石总容量不能超过箱子容量),不同的宝石有不同的容量和价值.求两个箱子里最大宝石的价值. 输入 line 1: Input n;  n:表示宝石数量    ...