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集合的便捷操作的更多相关文章

  1. 另外几种Java集合框架具体解释续

    另外几种Java集合框架具体解释续 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs fastutil库优于Trove库的 ...

  2. Guava增强for循环

    Guava的前身是Google Collections,是Google开发出的一个开源Java常用类库,包含了一些集合的便捷操作API.本文通过一些常用的例子来剖析Guava的奇妙之处. Guava是 ...

  3. 好的框架需要好的 API 设计 —— API 设计的六个原则

    说到框架设计,打心底都会觉得很大很宽泛,而 API 设计是框架设计中的重要组成部分.相比于有很多大佬都认可的面向对象的六大原则.23 种常见的设计模式来说,API 设计确实缺少行业公认的原则或者说设计 ...

  4. sumdoc t411 dir.txt

    C:\Users\zhoufeiyue\Documents\sumdoc t411\(9+条消息)redis Jedis存取list对象和map - shenjianxz的博客 - CSDN博客.mh ...

  5. JAVA常用集合源码解析系列-ArrayList源码解析(基于JDK8)

    文章系作者原创,如有转载请注明出处,如有雷同,那就雷同吧~(who care!) 一.写在前面 这是源码分析计划的第一篇,博主准备把一些常用的集合源码过一遍,比如:ArrayList.HashMap及 ...

  6. jdk8中关于操作集合的一些新特性,遍历和排序操作

    jdk8增加了不少新的东西,在集合操作这块,就有如 lamda表达式,stream,sort,optional等新的类,主要涉及遍历和排序等方面,新特性提升了不少性能,我们开发就是要拥抱新事物,守着老 ...

  7. JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序

    大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...

  8. Java容器类源码分析前言之集合框架结构(基于JDK8)

    一.基本概念 Java容器类库的用途是"保存对象",容器库类分为两个不同的分支. 1.Collection.可以保存一个或多个对象,将其保存为一个序列.Collection又可以细 ...

  9. JDK8漫谈——集合更强大

    解决什么问题 集合计算不足 解决重复代码 背后思想 管道 封装 数据处理 内容说明 是什么 计算担当.集合用于数据存储,流用于数据计算,不会修改原始数据 内置循环.高级迭代器,内置循环和计算 单向.数 ...

随机推荐

  1. urllib库在python2和python3环境下的使用区别

    好东西啊!!! Python 2 name Python 3 name urllib.urlretrieve() urllib.request.urlretrieve() urllib.urlclea ...

  2. 转:windows BAT 批处理脚本教程

    转自:http://www.cnblogs.com/mq0036/p/3412171.html BAT 批处理脚本教程 第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文 ...

  3. redis学习笔记——初始化

    初始化服务器状态结构 redis中一个最重要的数据结构是redis_server,会创建一个这个结构的全局变量server,初始化服务器的第一步就是创建一个struct redisServer类型的实 ...

  4. JMS与Spring之二(用message listener container异步收发消息)

    转自:http://blog.csdn.net/moonsheep_liu/article/details/6684948

  5. 屏幕录像大师如何把LXE文件转换为EXE文件

    EXE 和 LXE 实际上是同一种格式,文件大小完全相同,可以快速相互转换.区别是EXE复制到其它电脑上可以直接播放,LXE需要播放器播放,我们提供LXE播放器,而且是完全免费的.EXE的好处是复制到 ...

  6. Flutter常用布局组件

    Flutter控件本身通常由许多小型.单用途的控件组成,结合起来产生强大的效果,例如,Container是一种常用的控件,由负责布局.绘画.定位和大小调整的几个控件组成,具体来说,Container是 ...

  7. C# Conditional特性避免 预处理命令泛滥使用

    //#define CONDITION1 #define CONDITION2 using System; using System.Diagnostics; class Test { static ...

  8. 尚学堂的一个用了ExtJs的页面代码

    <html>     <head>         <meta http-equiv="Content-Type" content="tex ...

  9. ps修图之——四步去修图后的毛边

    PS修图时,多数PS工具都会在图片的边源处留下很多毛边如下图: 这个时候很多新手店主会非常苦脑,会退回原始图片上反复修图起图.可是结果也不怎么满意,当然也许有些店主会有其它方法. 其实不用那么麻烦,只 ...

  10. PHP中文乱码的常见解决方法总结

    PHP中文乱码是PHP开发中的常见问题之一.PHP中文乱码有时发生在网页本身,有些产生在于MySQL交互的过程中,有时与操作系统有关.下面进行一番总结. 一.首先是PHP网页的编码 1. php文件本 ...