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漫谈——集合更强大
解决什么问题 集合计算不足 解决重复代码 背后思想 管道 封装 数据处理 内容说明 是什么 计算担当.集合用于数据存储,流用于数据计算,不会修改原始数据 内置循环.高级迭代器,内置循环和计算 单向.数 ...
随机推荐
- 绘制函数 y=x^2-2x-3/2x^2+2x+1 的曲线
代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...
- python fabric使用 http://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html
fab -u username -p password -H hostname -P -- cmd 或root@'hostname' -H多个主机是引号用逗号隔开 -P异步
- javaweb开发所需的技术需求
本文仅为新手想学习javaWeb的提供一些参考,有不足或错误之处可以修改或添加,另希望以后学习者可以同样将自己的心得发来和大家分享...谢谢 1 前台:html,css,javascript 这是最 ...
- linux Java 手动GC 手动回收垃圾
logs_paths[0]="xxxx_tomcat8_9001"; logs_paths[1]="xxxx_tomcat8_9002"; for logs_p ...
- 类非静态成员的函数指针 的使用 Function pointer of a non-static member function of a class
you can get the pointer of the method, but it has to be called with an object typedef void (T::*Meth ...
- 启动loadrunner 11的controller提示试图执行系统不支持的操作(已解决)
启动loadrunner 11的controller提示试图执行系统不支持的操作 分类: loadrunner 2014-05-12 17:33 532人阅读 评论(0) 收藏 举报 win7旗舰版3 ...
- 单元测试JUnit 4(二)——keeps the bar green to keeps the code clean
1.Failure和Error Failure是指测试失败 Error是指测试程序本身出错 (int a=10/0) 2.JUnit常用注解 2.1 @RunWith: 可以更改测试运行器(继承o ...
- Oem7F7 通用完美激活v7.0绿色版 永久激活Windows7/2008
http://www.21andy.com/blog/20100906/1942.html
- Vue基础及脚手架环境搭建
From:http://www.jianshu.com/p/dc5057e7ad0d 一.vue基础 “Vue2.0”跟俺一起全面入坑 01 “Vue2.0”跟俺一起全面入坑 02 “Vue2.0”跟 ...
- java基础讲解10-----类的高级特性
一.final关键字 1.final关键字修饰变量,表示变量不可以被改变,如果想修改,编译器不会接受的. 注意:final关键字定义的变量必须赋值 public static final 修饰 白 ...