JDK8集合的便捷操作
JDK8新特性,stream相关操作。把集合转换成stream,再对其进行相关操作,加上lambada表达式。
demo:
List<String> list = Arrays.asList("a","b"); //所有实现了Conllection的类型都可以使用
String str = list.stream().map(x->{
try {
return x+" and "+x;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}).collect(Collectors.joining("\n")); // collect 收集器,把处理过的元素都手机起来,Collectors.joining("\n") 是用"\n"(换行符) 分开,也可以用别自己需要的
System.out.println(str);
执行结果:
a and a
b and b
集合元素分组收集,用字符串长度进行分组:
List<String> list = Arrays.asList("abc","bb","cc","a");
Map<Integer, List<String>> collect = list.stream().collect(Collectors.groupingBy(String::length));
System.out.println(collect.toString());
执行结果:
{1=[a], 2=[bb, cc], 3=[abc]}
集合的forEach:
List<String> list1 = Arrays.asList("abc","bb","cc","a");
list1.forEach(x->{
System.out.println(x.length()); //输出每个元素的长度
});
执行结果:
3
2
2
1
max和min函数,返回最值:
List<String> list = Arrays.asList("abc","bb","cc","a");
Optional<String> max = list.stream().max((a,b)->{
return a.compareTo(b);
});
System.err.println(max.orElse(null));
返回的max为list最大值。max可以调用get()函数,但是如果list为空,则max()返回的就是null,那直接使用get就会报错,但是JDK8改动后,orElse(null),表示如果对象为空,就返回null,不会报错。
平行流,就是把集合的个元素开多线程去处理:
List<String> list = IntStream.iterate(1, i -> i + 1).limit(20).mapToObj(Integer::toString).collect(Collectors.toList()); //limit 限制stream的最多个数
list.stream().parallel().forEach(x->{
System.out.println(x+" " +Thread.currentThread());
});
//可以直接用parallelStream转换平行流,如下 list.parallelStream().forEach(x->{
System.out.println(x);
});
执行结果:
13 Thread[main,5,main]
7 Thread[ForkJoinPool.commonPool-worker-1,5,main]
15 Thread[main,5,main]
6 Thread[ForkJoinPool.commonPool-worker-1,5,main]
9 Thread[ForkJoinPool.commonPool-worker-1,5,main]
10 Thread[ForkJoinPool.commonPool-worker-1,5,main]
8 Thread[ForkJoinPool.commonPool-worker-1,5,main]
2 Thread[ForkJoinPool.commonPool-worker-1,5,main]
1 Thread[ForkJoinPool.commonPool-worker-1,5,main]
5 Thread[ForkJoinPool.commonPool-worker-1,5,main]
4 Thread[ForkJoinPool.commonPool-worker-1,5,main]
18 Thread[ForkJoinPool.commonPool-worker-1,5,main]
20 Thread[ForkJoinPool.commonPool-worker-1,5,main]
19 Thread[ForkJoinPool.commonPool-worker-1,5,main]
17 Thread[ForkJoinPool.commonPool-worker-1,5,main]
16 Thread[ForkJoinPool.commonPool-worker-1,5,main]
12 Thread[ForkJoinPool.commonPool-worker-1,5,main]
11 Thread[ForkJoinPool.commonPool-worker-1,5,main]
14 Thread[main,5,main]
3 Thread[ForkJoinPool.commonPool-worker-3,5,main]
parallel执行是使用 ForkJoinPool的线程池,ForkJoinPool的最大线程数是CPU数-1,如果算上当前线程,则会有CPU数量的线程数执行任务。
集合的合并,把多个集合合并成一个集合并进行操作:
List<String> al = Arrays.asList("a", "b", "c", "d","e","f");
List<String> al2 = Arrays.asList("a1", "b1", "c1", "d1","e1","f1");
//吧al和al2合并后按单线程输出来
Stream.concat(al.stream(), al2.stream()).forEach(System.out::println);
System.out.println("******************");
//把al和al2合并,并按平行流输出
Stream.concat(al.stream(),al2.stream()).parallel().forEach(System.out::println);
System.out.println("------------------");
执行结果:
a
b
c
d
e
f
a1
b1
c1
d1
e1
f1
******************
b1
c1
a1
d
f
e
b
c
a
d1
e1
f1
------------------
上面一个执行语句是普通流操作,下面一个语句是平行流(parallel)操作。
stream还有很多操作
Optional<T> findFirst(); //返回stream的第一个
Optional<T> findAny(); //随机返回一个
Stream<T> of(T... values) ; //传入多个
JDK8集合的便捷操作的更多相关文章
- 另外几种Java集合框架具体解释续
另外几种Java集合框架具体解释续 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs fastutil库优于Trove库的 ...
- Guava增强for循环
Guava的前身是Google Collections,是Google开发出的一个开源Java常用类库,包含了一些集合的便捷操作API.本文通过一些常用的例子来剖析Guava的奇妙之处. Guava是 ...
- 好的框架需要好的 API 设计 —— API 设计的六个原则
说到框架设计,打心底都会觉得很大很宽泛,而 API 设计是框架设计中的重要组成部分.相比于有很多大佬都认可的面向对象的六大原则.23 种常见的设计模式来说,API 设计确实缺少行业公认的原则或者说设计 ...
- sumdoc t411 dir.txt
C:\Users\zhoufeiyue\Documents\sumdoc t411\(9+条消息)redis Jedis存取list对象和map - shenjianxz的博客 - CSDN博客.mh ...
- JAVA常用集合源码解析系列-ArrayList源码解析(基于JDK8)
文章系作者原创,如有转载请注明出处,如有雷同,那就雷同吧~(who care!) 一.写在前面 这是源码分析计划的第一篇,博主准备把一些常用的集合源码过一遍,比如:ArrayList.HashMap及 ...
- jdk8中关于操作集合的一些新特性,遍历和排序操作
jdk8增加了不少新的东西,在集合操作这块,就有如 lamda表达式,stream,sort,optional等新的类,主要涉及遍历和排序等方面,新特性提升了不少性能,我们开发就是要拥抱新事物,守着老 ...
- JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序
大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...
- Java容器类源码分析前言之集合框架结构(基于JDK8)
一.基本概念 Java容器类库的用途是"保存对象",容器库类分为两个不同的分支. 1.Collection.可以保存一个或多个对象,将其保存为一个序列.Collection又可以细 ...
- JDK8漫谈——集合更强大
解决什么问题 集合计算不足 解决重复代码 背后思想 管道 封装 数据处理 内容说明 是什么 计算担当.集合用于数据存储,流用于数据计算,不会修改原始数据 内置循环.高级迭代器,内置循环和计算 单向.数 ...
随机推荐
- 【Linux】Shell三类变量的作用域——linux shell “永久环境变量”、“临时环境变量”和"普通变量"之完全解读
2015-05-08 00:15 3896人阅读 评论(10) 收藏 举报 本文章已收录于: 分类: 软件开发进阶(419) 作者同类文章X Unix/Linux杂项(118) 作者同类文章X ...
- Node.js meitulu图片批量下载爬虫1.051
原有1.05版程序没有断点续传模式,现在在最近程序基础上改写一版1.051. //====================================================== // m ...
- vue - check-versions.js for child_process
webpack之类的配置文件. webpack.base.conf.js
- thinkphp+Jquery MiniUI 开发 管理系统
Jquery Miniui JS 兼容IE6+的浏览器,非常适合在企业内部使用. 管理系统等都非常方便. 在企业内部正在使用的是前期asp.net +fineui实现的管理系统.经过了几年的实践检验. ...
- 【VBA编程】08.数组
[数组简介]数组其实就是一组相同类型的数据的有序集合,其形象表示就像线性表.在存储数据的时候,首先在内存中分配一个连续的存储空间,将各个元素按顺序存放在连续的存储单元格中.[定义静态数组]Dim 数据 ...
- 基于Qt的A*算法可视化分析
代码地址如下:http://www.demodashi.com/demo/13677.html 需求 之前做过一个无人车需要自主寻找最佳路径,所以研究了相关的寻路算法,最终选择A算法,因为其简单易懂, ...
- sql 中 ALTER 和 UPDATE 的区别
alter 是DDL语句,是修改数据库中对象(表,数据库,视图..)的语句. 如需在表中添加列,请使用下面的语法: ALTER TABLE table_name ADD column_name dat ...
- http://blog.sina.com.cn/s/blog_6a01140c0100wimi.html
http://blog.sina.com.cn/s/blog_6a01140c0100wimi.html
- Android View Attributes
ImageView android:adjustViewBounds Set this to true if you want the ImageView to adjust its bounds ...
- 深度学习之Matlab 转C++在iOS上測试CNN手型识别
1 前言 在上一篇Blog.我介绍了在iOS上执行CNN的一些方法. 可是,一般来说.我们须要一个性能强劲的机器来跑CNN,我们仅仅只是须要将得到的结果用于移动端. 之前在Matlab使用UFLDL的 ...