Java8 stream流介绍
2016-04-02 00:11
501 查看
欢迎进入我的博客:blog.scarlettbai.com查看更多文章
首先我们来看如下代码:
执行结果如下:
list.stream()方法中会new一个
下面来看一些实际运用的例子:
一:filter过滤
还记得昨天写的过滤集合中的字符串长度大于4且以A结尾的例子吧,其实借助stream的filter可以更简单:
输出结果:
filter顾名思义,就是对于stream流进行一个过滤操作,入参是一个lambda表达式,返回的还是一个stream,也就是说后面还可以跟一个filter或者别的流操作,不过此处需要注意的是filter返回的是一个新的集合,不是直接在以前的集合上做的remove。上面代码写成这样也是一样的:
二:map修改集合中元素
stream流可以对于其中的元素通过map做处理,如将其中所有元素乘2:
输出结果:
三:reduce处理
reduce可以对stream流进行聚合处理,比如我们要将上个例子中的所有元素想加:
输出结果:
可以看到,结果是将map中输出的元素做了想加操作,这里reduce分别有1、2、3个参数的方法,大家可以点亲自试一下各自的用法,当然和
四:distinct去重处理
distinct可以对集合进行去重处理,如:
输出结果:
五:summaryStatistics做统计处理
stream通过mapToInt转换成IntStream后可以通过summaryStatistics方法来获取当前集合的状态量,比如最小值,最大值,平均值等,代码如下:
输出结果:
可以看到,通过这种方法可以很方便的对于集合做统计操作,当然这里不止有IntStream,还有DoubleStream和LongStream,原理是一样的,大家可以自己试试。
今天就先介绍到这里,大家有什么问题欢迎关注公众号后发消息提出。
欢迎关注个人微信公众号:读书健身编程
stream作为Java8的一个重要的新特性,其提供了对于集合的流处理模式,引出了管道的概念,即通过获取
stream流,之后可根据需要进行map、reduce处理,形象的比喻就是将集合想做一条流水,map、reduce则是管道,对流水进行了处理汇总统计等操作。
首先我们来看如下代码:
private static void getStream(){ List<String> list = new ArrayList<String>(Arrays.asList("读书","健身","编程")); System.out.println(list.stream()); list.stream().forEach(s -> System.out.println(s)); }
执行结果如下:
java.util.stream.ReferencePipeline$Head@135fbaa4 读书 健身 编程
list.stream()方法中会new一个
ReferencePipeline类,其中包含了filter、map、reduce等方法,大家可以点进去看下源码,看源码是个好习惯。
下面来看一些实际运用的例子:
一:filter过滤
还记得昨天写的过滤集合中的字符串长度大于4且以A结尾的例子吧,其实借助stream的filter可以更简单:
private static void testStatic(){ List<String> list = new ArrayList<>(Arrays.asList("aaaaA","aA","aaaaa")); list.stream().filter(str -> str.length() > 4 && str.endsWith("A")) .forEach(System.out::printf); }
输出结果:
aaaaA
filter顾名思义,就是对于stream流进行一个过滤操作,入参是一个lambda表达式,返回的还是一个stream,也就是说后面还可以跟一个filter或者别的流操作,不过此处需要注意的是filter返回的是一个新的集合,不是直接在以前的集合上做的remove。上面代码写成这样也是一样的:
private static void testStatic(){ List<String> list = new ArrayList<>(Arrays.asList("aaaaA","aA","aaaaa")); list.stream().filter(str -> str.endsWith("A")) .filter(str -> str.length() > 4).forEach(System.out::printf); }
二:map修改集合中元素
stream流可以对于其中的元素通过map做处理,如将其中所有元素乘2:
private static void testMap(){ List<Double> list = new ArrayList<>(Arrays.asList(5d,6d,3d,7d)); list.stream().map(d -> d*2).forEach(System.out::println); }
输出结果:
10.0 12.0 6.0 14.0
三:reduce处理
reduce可以对stream流进行聚合处理,比如我们要将上个例子中的所有元素想加:
private static void testReduce(){ List<Double> list = new ArrayList<>(Arrays.asList(5d,6d,3d,7d)); System.out.println(list.stream().map(d -> d*2) .reduce(0d,(result , d) -> result +=d)); }
输出结果:
42.0
可以看到,结果是将map中输出的元素做了想加操作,这里reduce分别有1、2、3个参数的方法,大家可以点亲自试一下各自的用法,当然和
mongodb等不一样的地方在于,这里的reduce不是必须要放在map后的,也可以不要map直接使用的。
四:distinct去重处理
distinct可以对集合进行去重处理,如:
private static void testDistinct(){ List<Integer> list = new ArrayList<>(Arrays.asList(5,6,3,7,3,1,5)); list.stream().distinct().forEach(System.out::println); }
输出结果:
5 6 3 7 1
五:summaryStatistics做统计处理
stream通过mapToInt转换成IntStream后可以通过summaryStatistics方法来获取当前集合的状态量,比如最小值,最大值,平均值等,代码如下:
private static void testSummary(){ List<Long> list = new ArrayList<>(Arrays.asList(5l,6l,3l,7l,1l)); IntSummaryStatistics status = list.stream().mapToInt(x -> x.intValue()).summaryStatistics(); System.out.println("minVaule=" + status.getMin()); System.out.println("maxVaule=" + status.getMax()); System.out.println("avgVaule=" + status.getAverage()); System.out.println("sum=" + status.getSum()); }
输出结果:
minVaule=1 maxVaule=7 avgVaule=4.4 sum=22
可以看到,通过这种方法可以很方便的对于集合做统计操作,当然这里不止有IntStream,还有DoubleStream和LongStream,原理是一样的,大家可以自己试试。
今天就先介绍到这里,大家有什么问题欢迎关注公众号后发消息提出。
欢迎关注个人微信公众号:读书健身编程
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树