jdk1.8 -- stream 的使用
一.stream介绍
stream 是jdk 一个加强的api操作,翻译过来就是流的意思,主要是对Collection 集合的一些操作,流一但生成就会有方向性,类似于自来水管的水流一样,不可以重复使用。
stream 中的操作有filter map limt sorted collect
二.生成stream的方式
集合.stream(); − 为集合创建串行流
集合.parallelStream() − 为集合创建并行流
//列举一些常见的创建stream的方法
List<Apple> apples = Arrays.asList(new Apple("red", 120),new Apple("green", 170),new Apple("yellow", 200)); Stream<Apple> stream = apples.stream(); Stream<Apple> stream2 = Stream.of(new Apple("red", 120),new Apple("green", 170),new Apple("yellow", 200)); Apple arr [] = {new Apple("red", 120),new Apple("green", 170),new Apple("yellow", 200)};
Stream<Apple> stream3 = Arrays.stream(arr);
三.stream中的操作
1.filter distinct skip limit 操作
public class StreamOperator {
public static void main(String[] args) {
List<Integer> asList = Arrays.asList(1, 2, 3, 4, 5, 7, 6, 4, 2, 1, 8, 6, 9, 3);
// 1.filter 过滤偶数 将流按一定条件进行过虑 返回过虑后符合规则的stream
List<Integer> filterList = asList.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
System.out.println(filterList);
//2.distinct 去重
List<Integer> disList = asList.stream().distinct().collect(Collectors.toList());
System.out.println(disList);
//3.skip 跳过n个元素
List<Integer> skipList = asList.stream().skip(5).collect(Collectors.toList());
System.out.println(skipList);
//4.limit 极限值是几个(个人理解,也就是最多取几个元素,如果limit取的个数超过了stream中元素的最大个数,会取到流中的全部元素)
List<Integer> limList = asList.stream().limit(5).collect(Collectors.toList());
System.out.println(limList); }
}
2.map flatmap操作
public class StreamTest {
public static void main(String[] args) {
//map 操作
List<Apple> apples =Arrays.asList(
new Apple("green", 150),new Apple("red", 170),new Apple("yellow", 190),
new Apple("blue", 210));
//map 操作是将stream 通过map操作返回符合map规则的stream
// map 与filter 的区别
// map是一个Function 即传和一个 T 返回一个 R 类似于get操作 如果流中有元素符合map的操作条件,会将得到的R存入到stream中,会改变流中存储的元素
// filter 是一个 Predicate 即传入一个 T 返回的是bollean 是用来做判断的,如果流中的某个元素符合filter的条件,就会存入到stream中,不符合的将被过滤掉,不会改变流中存储的元素
Stream<String> map = apples.stream().map(Apple::getColor);
//flatmap(扁平化)
String [] arr = {"hello","world"};
//{h,e,l,l,o} {w,o,r,l,d}
Stream<String[]> streamMap = Arrays.stream(arr).map(w->w.split(""));
//[h,e,l,l,o,w,o,r,l,d] 由flatMap的参数可知,传入的参数T最后都合成一个只要是继承stream的类即可,因此将streamMap流数组传入flatMap会得到1个stream流
// flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
// R apply(T t);
Stream<String> flatMap = streamMap.flatMap(Arrays::stream);
flatMap.distinct().forEach(System.out::print);
}
}
3.sort collect
public class StreamTest {
public static void main(String[] args) {
List<Apple> apples =Arrays.asList(
new Apple("green", 150),new Apple("red", 170),new Apple("yellow", 190),
new Apple("blue", 210));
//sorted 是按颜色的字母顺序来排序
//collect 是将流转换成相对应的集合
List<Apple> collect = apples.stream().sorted(Comparator.comparing(Apple::getColor)).collect(Collectors.toList());
}
}
四.stream 的并行操作
将集合转换成并行流后之后,其它操作与串行流相同
并行流可以通过将程序休眠,通过jconsole 工具查看
jdk1.8 -- stream 的使用的更多相关文章
- 使用jdk1.8 stream特性对参数名称进行排序
在对外对接的时候,通常会碰到签名方式, 然后签名的时候,要求按照参数名称进行排序. 比如参数为 c=22&a=1, 需要将结果排序为a=1&c=22, 然后再进行别的运算. 可以使用j ...
- JDK1.8 Stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...
- jdk1.8 Stream 特性总结
不是数据结构 它没有内部存储,它只是用操作管道从 source(数据结构.数组.generator function.IO channel)抓取数据. 它也绝不修改自己所封装的底层数据结构的数据.例如 ...
- java代码之美(12)---CollectionUtils工具类
java代码之美(12)---CollectionUtils工具类 这篇讲的CollectionUtils工具类是在apache下的, 而不是springframework下的CollectionUt ...
- Java中List集合去除重复数据的六种方法
1. 循环list中的所有元素然后删除重复 public static List removeDuplicate(List list) { for ( int i = 0 ; i < list. ...
- java代码(12) ---CollectionUtils工具类
CollectionUtils工具类 CollectionUtils工具类是在apache下的,而不是springframework下的CollectionUtils 个人觉得在真实项目中Collec ...
- ForkJoinPool大型图文现场(一阅到底 vs 直接收藏)
知识回顾 并发工具类我们已经讲了很多,这些工具类的「目标」是让我们只关注任务本身,并且忽视线程间合作细节,简化了并发编程难度的同时,也增加了很多安全性.工具类的对使用者的「目标」虽然一致,但每一个工具 ...
- Java进阶篇之十五 ----- JDK1.8的Lambda、Stream和日期的使用详解(很详细)
前言 本篇主要讲述是Java中JDK1.8的一些新语法特性使用,主要是Lambda.Stream和LocalDate日期的一些使用讲解. Lambda Lambda介绍 Lambda 表达式(lamb ...
- JDK1.8新特性——Stream API
JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...
随机推荐
- PHP mysqli_fetch_lengths() 函数
mysqli_fetch_lengths() 函数返回结果集中的字段长度. <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_con ...
- 用JavaScript实现快排
啥是快排这里就不讲了,主要还是把原来c++学的东西抓紧转化过来 快排运用的是分而治之的思想,确定一个中值,把大的放右边,小的放左边,然后再左右分别对左右的左右(雾)进行处理 需要注意的一点是,这玩意远 ...
- kubernetes1.11.1 部署prometheus
部署前提:已经安装好了kubernetes的集群,版本是1.11.1,是用kubeadm部署的. 2台虚拟机:master:172.17.1.36 node1:172.17.1.40 pro ...
- Vue小实例
最近刚学习Vue的官方文档,了解了指令.模板.组件.数据双向绑定等有关Vue的知识点.因此估摸着做点实例出来练练手. 下面介绍一个简单的例子,模拟购物车自动统计金额,效果图如下: 代码如下: < ...
- LeetCode687----最长同值路径
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: 5 / \ 4 5 / ...
- python格式化输出(% format用法)
%基本用法: 十进制输出:print('%d' % 6) 6也可以换成其它的数字变量 八进制输出:print('%o' % 6) 6也可以换成其它的数字变量 字符串输出:print('%s' ...
- Flume-Failover Sink Processor 故障转移与 Load balancing Sink 负载均衡
接上一篇:https://www.cnblogs.com/jhxxb/p/11579518.html 使用 Flume1 监控一个端口,其 sink 组中的 sink 分别对接 Flume2 和 Fl ...
- 手把手教你把5V的Arduino改造成3.3V版本
Arduino Pro Mini是基于ATmega328的微控制板,支持5V/3.3V电压.但是我们比较容易买到的是5V供电的版本,有的时候需要用到3.3V版本(比如我们的软控DAC).怎样才能让这款 ...
- 在matlab中读取trc文件
用matlab的load()函数 1.相对路径读法(将文件放入'MATLAB\bin'目录): a = load('aizhenjiang_g10.trc') 2.绝对路径读法(任何位置) a = f ...
- 2018网特招新题writeup
沈永宁(周鸣振)这狗比,晚上才发现他隐姓埋名偷偷刷了分还刷到了第一名,不行我也刷...我刷刷刷