并发编程:并行反应式流:收集流(collect)

39 篇文章 0 订阅
13 篇文章 0 订阅

目录

一、主程序

二、辅助类

三、其他辅助类

四、执行结果


一、主程序

package xyz.jangle.thread.test.n6_4.collect;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;

import xyz.jangle.thread.test.n6_2.create.Person;
import xyz.jangle.thread.test.n6_2.create.PersonGenerator;

/**
 * 6.4、收集流
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月3日 下午9:27:11
 * 
 */
public class M {

	public static void main(String[] args) {
		// 1、收集成一个Map
		List<Person> persons = PersonGenerator.generatePersonList(100);
		ConcurrentMap<String, List<Person>> personByName = persons.parallelStream()
				.collect(Collectors.groupingByConcurrent(Person::getFirstName));
		// 遍历这个Map,并打印相关信息
		personByName.keySet().forEach(key -> {
			List<Person> list = personByName.get(key);
			System.out.println(key + " : " + list.size());
		});

		// 2、串联方式收集
		String resultName = persons.parallelStream().map(p -> p.toString()).collect(Collectors.joining(","));
		System.out.println("串联方式收集的名称:" + resultName);

		// 3、拆分为2组 薪资大于50000 和小于等于50000的
		Map<Boolean, List<Person>> part = persons.parallelStream()
				.collect(Collectors.partitioningBy(p -> p.getSalary() > 50000));
		part.keySet().forEach(k -> {
			List<Person> list = part.get(k);
			System.out.println(k + ":" + list.size());
		});

		// 4、收集成一个Map (firstName作key, LastName做value ,当存在相同的key时,将2个value用s1+","+s2的方式拼接
		Map<String, String> map = persons.parallelStream()
				.collect(Collectors.toMap(p -> p.getFirstName(), p -> p.getLastName(), (s1, s2) -> s1 + "," + s2));
		map.forEach((k, v) -> {
			System.out.println(k + ":" + v);
		});

		// 5、并行处理列表,再合并列表
		ArrayList<Object> highSalaryPerson = persons.parallelStream().collect(ArrayList::new, (list, p) -> {
			if (p.getSalary() > 50000) {
				list.add(p);
			}
		}, ArrayList::addAll);
		System.out.println("高新人数:" + highSalaryPerson.size());

		// 6、收集为ConcurrentHashMap
		ConcurrentHashMap<String, Counter> peopleNames = persons.parallelStream().collect(
				// 构造一个ConcurrentHashMap
				ConcurrentHashMap::new,
				// 向m中添加p
				(m, p) -> {
					// key存在时
					m.computeIfPresent(p.getFirstName(), (name, counter) -> {
						counter.increment();
						return counter;
					});
					// key不存在时
					m.computeIfAbsent(p.getFirstName(), name -> {
						Counter counter = new Counter();
						counter.setValue(name);
						return counter;
					});
				}, (map1, map2) -> {
					// 合并2个map
					map2.forEach(10, (k, v) -> {
						map1.merge(k, v, (v1, v2) -> {
							v1.setCounter(v1.getCounter() + v2.getCounter());
							return v1;
						});
					});
				});
		peopleNames.forEach((name, counter) -> {
			System.out.println(name + ":" + counter.getCounter());
		});

	}

}

二、辅助类

package xyz.jangle.thread.test.n6_4.collect;

/**
 * 	辅助类
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月3日 下午9:28:51
 * 
 */
public class Counter {

	private String value;
	private int counter;

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public int getCounter() {
		return counter;
	}

	public void setCounter(int counter) {
		this.counter = counter;
	}

	public synchronized void increment() {
		counter++;

	}

}

三、其他辅助类

https://blog.csdn.net/Bof_jangle/article/details/108350870

四、执行结果

A : 12
B : 14
C : 12
D : 15
E : 15
F : 12
G : 20
串联方式收集的名称:D T,F Y,F X,G Y,D X,G Y,A Z,D T,G U,C Z,G Z,F V,B T,A W,E T,G Z,B U,F U,C Y,F Y,A X,G W,E W,E Y,E V,E Z,B Z,A W,C T,G X,G Y,D V,E T,C T,D T,B Y,G V,C X,E V,A U,C X,B X,E V,D U,C T,E W,E V,G Z,B V,B T,F V,E U,A Z,B T,G T,C U,B U,A V,G X,C W,G W,E W,F Z,F T,B Y,B Z,D Y,E Y,B T,E X,A T,E V,G Z,C T,D Z,D Z,A X,D Z,F Y,G X,G T,D V,D V,A V,B T,F Z,B Z,D V,A U,D T,G V,A T,G W,C U,C T,G T,F W,D T,G X,F X
false:50
true:50
A:Z,W,X,W,U,Z,V,T,X,V,U,T
B:T,U,Z,Y,X,V,T,T,U,Y,Z,T,T,Z
C:Z,Y,T,T,X,X,T,U,W,T,U,T
D:T,X,T,V,T,U,Y,Z,Z,Z,V,V,V,T,T
E:T,W,Y,V,Z,T,V,V,W,V,U,W,Y,X,V
F:Y,X,V,U,Y,V,Z,T,Y,Z,W,X
G:Y,Y,U,Z,Z,W,X,Y,V,Z,T,X,W,Z,X,T,V,W,T,X
高新人数:50
A:0
B:2
C:1
D:3
E:1
F:2
G:4

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值