文档章节

jdk8 收集器

zhuliu
 zhuliu
发布于 01/03 02:36
字数 706
阅读 4
收藏 0
/**
	 * 收集器
	 */
	@Test
	public void test4(){
		List<String> collect = Stream.of("年后", "看懂", "看到").collect(Collectors.toList());
		Set<String> collect2 = Stream.of("年后", "看懂", "看到").collect(Collectors.toSet());
		//返回不可修改的集合 如果修改将抛出异常UnsupportedOperationException
		Set<String> collect3 = Stream.of("年后", "看懂", "看到").collect(Collectors.toUnmodifiableSet());
		List<String> collect4 = Stream.of("年后", "看懂", "看到").collect(Collectors.toUnmodifiableList());

		//使用非接口List,Set类型
		TreeSet<String> collect1 = Stream.of("年后", "看懂", "看到").collect(Collectors.toCollection(TreeSet::new));
		LinkedList<String> collect5 = Stream.of("年后", "看懂", "看到").collect(Collectors.toCollection(LinkedList::new));
		//比较大小获取最大值
		String s = Stream.of("年后", "看懂", "看到").collect(Collectors.maxBy((x, y) -> x.compareTo(y))).get();
		System.out.println(s);
		String s1 = Stream.of("年后", "看懂", "看到").collect(Collectors.minBy((x, y) -> x.compareTo(y))).get();
		System.out.println(s1);

		//数据统计
		IntSummaryStatistics collect6 = Stream.of("1", "2", "3").map(x -> Integer.valueOf(x)).collect(Collectors.summarizingInt(x -> x.intValue()));
		System.out.println(String.format("sum:%d,avg:%f,max:%d,min:%d,count:%d", collect6.getSum(),collect6.getAverage(),collect6.getMax(),collect6.getMin(),collect6.getCount()));
		//数据分块
		Map<Boolean, List<Person>> collect7 =  Stream.of(new Man(), new Man(), new Girl(), new Girl(), new Girl()).collect(Collectors.partitioningBy(x -> "女人".equals(x.getName())));
		System.out.println(collect7);
		//数据分组
		Map<String, List<Person>> collect8 =  Stream.of(new Man(), new Man(), new Girl(), new Girl(), new Girl()).collect(Collectors.groupingBy(Person::getName));
		System.out.println(collect8);
		//拼接字符串
		String collect9 = Stream.of(new Man(), new Man(), new Girl(), new Girl(), new Girl()).map(x -> x.getName()).collect(Collectors.joining());
		System.out.println(collect9);
		//添加分割符
		String collect10= Stream.of(new Man(), new Man(), new Girl(), new Girl(), new Girl()).map(x -> x.getName()).collect(Collectors.joining(","));
		System.out.println(collect10);
		//添加前后缀
		String collect11= Stream.of(new Man(), new Man(), new Girl(), new Girl(), new Girl()).map(x -> x.getName()).collect(Collectors.joining(",","{","}"));
		System.out.println(collect11);

		List<Chicken> list = new ArrayList<>(5);
		for (int i = 0; i < 5; i++) {
			Chicken chicken = new Chicken();
			chicken.setName(String.valueOf(ThreadLocalRandom.current().nextInt(3)));
			List<Chicken> lt = new LinkedList<>();
			for (int k = 0; k < ThreadLocalRandom.current().nextInt(); k++) {
				lt.add(new Chicken());
			}
			chicken.setDescendants(lt);
			list.add(chicken);
		}
		System.out.println(list);
		//分组并获取该组一共有多少个相同名称的鸡
		Map<String, Long> collect12 = list.stream().collect(Collectors.groupingBy(Chicken::getName, Collectors.counting()));
		System.out.println(collect12);
		//分组获取每组子节点最多的对象的option
		Map<String, Optional<Chicken>> collect13 = list.stream().collect(Collectors.groupingBy(Chicken::getName, Collectors.maxBy((x, y) -> Integer.valueOf(x.getDescendants().size()).compareTo(y.getDescendants().size()))));
		System.out.println(collect13);
		//根据上面的option获取每组子节点最多的对象
		List<Chicken> collect15 = collect13.entrySet().stream().map(x -> x.getValue().get()).collect(Collectors.toList());
		System.out.println(collect15);
		//映射 根据名称分组并统计所有相同名称下的所有字节点总数
		Map<String, Integer> collect14 = list.stream().collect(Collectors.groupingBy(Chicken::getName, Collectors.mapping(Chicken::getDescendants, Collectors.summingInt(x -> x.size()))));
		System.out.println(collect14);
	}

看懂
年后
sum:6,avg:2.000000,max:3,min:1,count:3
{false=[com.demo.Man@18a70f16, com.demo.Man@62e136d3], true=[com.demo.Girl@c8e4bb0, com.demo.Girl@6279cee3, com.demo.Girl@4206a205]}
{人=[com.demo.Man@4d826d77, com.demo.Man@61009542], 女人=[com.demo.Girl@77e9807f, com.demo.Girl@448ff1a8, com.demo.Girl@1a38c59b]}
人人女人女人女人
人,人,女人,女人,女人
{人,人,女人,女人,女人}
[Chicken{name='0', descendants=[Chicken{name='null', descendants=null}, Chicken{name='null', descendants=null}, Chicken{name='null', descendants=null}]}, Chicken{name='2', descendants=[]}, Chicken{name='0', descendants=[Chicken{name='null', descendants=null}]}, Chicken{name='0', descendants=[]}, Chicken{name='0', descendants=[]}]
{0=4, 2=1}
{0=Optional[Chicken{name='0', descendants=[Chicken{name='null', descendants=null}, Chicken{name='null', descendants=null}, Chicken{name='null', descendants=null}]}], 2=Optional[Chicken{name='2', descendants=[]}]}
[Chicken{name='0', descendants=[Chicken{name='null', descendants=null}, Chicken{name='null', descendants=null}, Chicken{name='null', descendants=null}]}, Chicken{name='2', descendants=[]}]
{0=4, 2=0}

© 著作权归作者所有

zhuliu

zhuliu

粉丝 3
博文 61
码字总数 17606
作品 0
深圳
私信 提问
使用JDK8新特性重构你的代码

lambda 表达式 当一个接口只有一个方法的时候都可以使用lambda 表达式代替 这种称为函数接口可以用 @FunctionalInterface 修饰 lambda 表达式多种形式 使用lambda表达式实现设计模式 这里我们...

12叔
2016/04/15
669
0
推荐书籍:《Java性能调优指南》

本书作者是Java性能和Java HotSpot 虚拟机领域的佼佼者,帮助你利用现代软工实践提高性能,避免常见错误,从实战生涯中总结技巧和窍门。 利用G1克服并行、串行和CMS垃圾收集器的局限性了解G...

ddddd8
2017/11/27
0
0
7种 JVM 垃圾收集器特点、优劣势及使用场景(多图)

一、常见垃圾收集器 现在常见的垃圾收集器有如下几种: 新生代收集器: Serial ParNew Parallel Scavenge 老年代收集器: Serial Old CMS Parallel Old 堆内存垃圾收集器:G1 每种垃圾收集器...

Java进阶高级指南
08/15
0
0
深入理解JVM学习笔记(十九、JVM 垃圾回收机制---如何判断对象是否为垃圾)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jintaohahahaha/article/details/82634133 一、引用计数法 引用计数算法作为垃圾收集器最早的算法,有其优势,...

张--小涛涛
2018/09/11
0
0
Java GC你不得不知的那些事

我们已经知道Java堆是被所有线程共享的一块内存区域,所有对象实例和数组都在堆上进行内存分配。为了进行高效的垃圾回收,虚拟机把堆内存划分成新生代(Young Generation)、老年代(Old Gen...

Java架构
2018/05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
16分钟前
7
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
45分钟前
4
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
45分钟前
7
0
Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
50分钟前
18
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部