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漫谈——集合更强大
		解决什么问题 集合计算不足 解决重复代码 背后思想 管道 封装 数据处理 内容说明 是什么 计算担当.集合用于数据存储,流用于数据计算,不会修改原始数据 内置循环.高级迭代器,内置循环和计算 单向.数 ... 
随机推荐
- [Android Pro]   Android的5个进程等级
			1.foreground process 正处于activity resume状态 正处于bound服务交互的状态 正处于服务在前台运行的状态(StartForeGround( ... 
- 省市区县三级联动JAVA+MySQL+JQuery
			场景介绍: 由于项目要求,需要做一个进件(新增)功能,而该功能里要用到车品牌.车系.车型的联动查询,也就是经典的三级联动. 大体思路如下: 进入页面,会把所有的车品牌(第一级)在后台查询出来,放到缓存 ... 
- [ES6] 07. Default Value for function param
			Normally, we can set default value for function param: //Here use "Hello" as default param ... 
- Elasticsearch的javaAPI之query dsl-queries
			Elasticsearch的javaAPI之query dsl-queries 和rest query dsl一样,elasticsearch提供了一个完整的Java query dsl. 查询建造者 ... 
- unable to connect to ssl://gateway.sandbox.push.apple.com:2195 错误
			使用APNS 搭建苹果推送服务器错误:unable to connect to ssl://gateway.sandbox.push.apple.com:2195 错误 1:检查你的服务器的端口 21 ... 
- cocos2dx 制作单机麻将(四)
			cocos2dx 制作单机麻将(四) 麻将逻辑5.模拟出牌 // // main.cpp // MajiangLogicTest // // Created by TinyUlt on 14-8-16 ... 
- 项目启动报错:No suitable driver found for jdbc:oracle:thin:@192.168.7.146:1521:oracle
			No suitable driver found for jdbc:oracle:thin:@192.168.7.146:1521:oracle 这个错误的原因主要有以下几方面的原因: 1. url配 ... 
- Mysql 中 HAVING 和 USING 的使用
			1. HAVING 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用. 实例:现表Orders(订单)有如下字段: Id,Date,Price ,Customer ... 
- 采集音频和摄像头视频并实时H264编码及AAC编码
			转自:http://www.cnblogs.com/haibindev/archive/2011/11/10/2244442.html 0. 前言 我在前两篇文章中写了DirectShow捕获音视频然 ... 
- FastDFS这种架构,如何配置?
			FastDFS这种架构,如何配置?才能让欧洲用户可以就近下载Storage Server1的文件,而不是到中国的Storage Server 2下载? 
