并发编程:并行反应式流:创建流(parallelStream())

循环工程:从基础语法到高性能架构的实践指南 循环是编程中的基础控制结构,用于重复执行特定代码块。其核心原理在于通过迭代器或索引遍历数据集合,实现对元素的处理。在工程实践中,循环的价值不仅在于完成遍历任务,更在于其性能优化、资源管理和代码可维护性方面的关键作用。通过合理设计循环边界、控制副作用和选择迭代策略,可以显著提升程序效率。在应用场景上,循环广泛应用于数据处理、算法实现和系统流程控制等领域。本文聚焦于循环工程化实践,深入探讨了迭代器优化、时间复杂度分析等热词,并提供了并行流处理等高级技术方案,帮助开发者将基础循环转化为高性能、可维护的架构组件。 阅读详情

目录

一、主程序

二、雇员类

三、雇员工厂类

四、自定义的Supplier类

五、执行结果


一、主程序

package xyz.jangle.thread.test.n6_2.create;

import java.io.BufferedReader;
import java.io.FileReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.DoubleStream;
import java.util.stream.Stream;

/**
 * 6.2、使用不同的源创建流
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月1日 下午6:03:15
 * 
 */
public class M {

	public static void main(String[] args) {

		// 从一个Collection中创建流
		System.out.println("从一个Collection中创建流");
		List<Person> persons = PersonGenerator.generatePersonList(10000);
		Stream<Person> parallelStream = persons.parallelStream();
		System.out.println("流总数:" + parallelStream.count());

		// 从Supplier中创建流
		System.out.println("从Supplier中创建流");
		MySupplier mySupplier = new MySupplier();
		Stream<String> generate = Stream.generate(mySupplier);
		generate.parallel().limit(10).forEach(p -> System.out.println(p));

		// 从一个定义好的元素集合上创建流
		System.out.println("从一个定义好的元素集合上创建流");
		Stream<String> stream = Stream.of("1", "2", "3", "4A");
		stream.parallel().forEach(p -> System.out.println(p));

		// 从一个文件中创建流
		System.out.println("从一个文件中创建流");
		try (BufferedReader br = new BufferedReader(new FileReader("C:\\logs\\myTestDemo\\log.log"));) {
			Stream<String> lines = br.lines();
			System.out.println("文件总共行数" + lines.count());
			System.out.println("***********************");
			br.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 创建一个目录流
		System.out.println("创建一个目录流");
		try {
			Stream<Path> directoryContent = Files.list(Paths.get(System.getProperty("user.home")));
			System.out
					.println(System.getProperty("user.home") + "目录下的文件和文件夹数量为:" + directoryContent.parallel().count());
//			Files.list(Paths.get(System.getProperty("user.home"))).parallel().forEach(p -> System.out.println(p.getFileName()));
			directoryContent.close();
			System.out.println("***********************");
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 使用一个数组创建流
		System.out.println("使用一个数组创建流");
		String array[] = { "1", "2", "3", "4", "5" };
		Stream<String> streamFromArray = Arrays.stream(array);
		streamFromArray.parallel().forEach(p -> System.out.println(p));

		// 创建一个双精度型数字流
		System.out.println("创建一个双精度型数字流");
		Random random = new Random();
		DoubleStream doubleStream = random.doubles(10);
		double asDouble = doubleStream.parallel().peek(p -> System.out.println(p)).average().getAsDouble();
		System.out.println("平均值" + asDouble);

		// 连接两个流
		System.out.println("连接两个流");
		Stream<String> s1 = Stream.of("1", "2", "3", "4", "5");
		Stream<String> s2 = Stream.of("0", "9", "8", "7", "6");
		Stream<String> concat = Stream.concat(s1, s2);
		concat.parallel().forEach(p -> System.out.println(p));

	}

}

二、雇员类

package xyz.jangle.thread.test.n6_2.create;

import java.util.Date;

/**
 * 	普通类,雇员信息
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月1日 下午6:03:57
 * 
 */
public class Person implements Comparable<Person> {

	private int id;
	private String firstName, lastName;
	private Date birthDate;
	private int salary;
	private double coeficient;

	@Override
	public int compareTo(Person o) {
		int compareLastNames = this.getLastName().compareTo(o.getLastName());
		if (compareLastNames != 0) {
			return compareLastNames;
		} else {
			return this.getFirstName().compareTo(o.getFirstName());
		}
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public Date getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}

	public double getCoeficient() {
		return coeficient;
	}

	public void setCoeficient(double coeficient) {
		this.coeficient = coeficient;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Person) {
			return this.compareTo((Person) obj) == 0;
		} else {
			return false;
		}
	}

	@Override
	public int hashCode() {
		String sequence = this.getLastName() + this.getFirstName();
		return sequence.hashCode();
	}

}

三、雇员工厂类

package xyz.jangle.thread.test.n6_2.create;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
 * 雇员工厂类
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月1日 下午6:09:56
 * 
 */
public class PersonGenerator {

	public static List<Person> generatePersonList(int size) {
		List<Person> ret = new ArrayList<>();
		String firstNames[] = { "A", "B", "C", "D", "E", "F", "G" };
		String lastNames[] = { "Z", "Y", "X", "W", "V", "U", "T" };
		Random r = new Random();
		for (int i = 0; i < size; i++) {
			Person person = new Person();
			person.setId(i);
			person.setFirstName(firstNames[r.nextInt(7)]);
			person.setLastName(lastNames[r.nextInt(7)]);
			person.setSalary(r.nextInt(100000));
			person.setCoeficient(r.nextDouble() * 10);
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.YEAR, -r.nextInt(30));
			Date date = calendar.getTime();
			person.setBirthDate(date);
			ret.add(person);
		}
		return ret;
	}

	public static void main(String[] args) {
		Random r = new Random();
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, -r.nextInt(30));
		Date date = calendar.getTime();
		System.out.println(date);
	}
}

四、自定义的Supplier类

package xyz.jangle.thread.test.n6_2.create;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;

/**
 * 	Supplier类
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月1日 下午6:23:07
 * 
 */
public class MySupplier implements Supplier<String> {

	private final AtomicInteger counter;

	public MySupplier() {
		counter = new AtomicInteger();
	}

	@Override
	public String get() {
		int v = counter.getAndAdd(1);
		return "String " + v;
	}
	
	public static void main(String[] args) {
		MySupplier mySupplier = new MySupplier();
		String string = mySupplier.get();
		System.out.println(string);
	}

}

五、执行结果

从一个Collection中创建流:
流总数:10000
从Supplier中创建流:
String 0
String 1
String 2
String 3
String 4
String 5
String 6
String 7
String 8
String 9
从一个定义好的元素集合上创建流:
3
1
2
4A
从一个文件中创建流:
文件总共行数547
***********************
创建一个目录流:
C:\Users\jangl目录下的文件和文件夹数量为:48
***********************
使用一个数组创建流:
3
4
1
5
2
创建一个双精度型数字流:
0.9286771067836513
0.8593370268418871
0.4878854359545084
0.5024670874334626
0.5431428356626822
0.7909467797726744
0.30035926165462845
0.6771305053536314
0.5613468358268507
0.18463790001057356
平均值0.583593077529455
连接两个流:
9
0
4
5
7
8
2
3
6
1

 

Java List集合核心特性与性能优化全解析 List作为Java集合框架中最基础的有序集合接口,其基于动态数组或链表的实现原理决定了不同场景下的性能表现。从数据结构角度看,ArrayList的O(1)随机访问和LinkedList的O(1)增删操作体现了不同底层实现的特性差异。在工程实践中,合理的容量预设、批量操作API使用以及并发安全处理都是提升List性能的关键技术点。特别是在大数据量场景下,通过Java8 Stream API进行并行处理,或选择CopyOnWriteArrayList等线程安全实现,能有效解决实际开发中的性能瓶颈问题。本文通过 阅读详情

相关推荐

电信天翼云OS(ctyunos)内网离线安装Docker-CE保姆级避坑指南(附完整依赖包清单)

本文提供电信天翼云OS(ctyunos)内网环境下Docker-CE的离线安装全攻略,涵盖依赖分析、离线包制备、冲突解决等关键步骤。针对金融、政务等隔离网络场景,详细解析如何通过本地仓库构建和优化配置,实现高效安全的容器化部署,助力企业快速搭建内网Docker环境。

397

通过parallelStream多线程异步任务执行提高代码运行效率

我们创建自己的线程池,所以(1)可以避免共享线程池,(2)可以分配比处理机数量更多的线程。parallelStream().peek()的使用。

weixin_61428498的博客 723

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南

本文全面解析了青龙人形机器人硬件平台的设计与实现,涵盖构型设计、驱动系统、能源方案及控制系统等核心模块。重点介绍了43个自由度的仿生学实践、关节模组的技术突破以及多模态感知融合等创新设计,为开发者提供了从理论到实战的完整指南。

embedding5hiker的博客 890

Stream流和ParallelStream并行流详解及对比

本文详细介绍了Stream流的基本概念和用法,最后简单介绍了parallelStream并行流及与Stream流的对比。通过上述内容基本对工作中可能遇到的概念及常用方法进行了梳理,希望本文可以给读者带来帮助。

Clearlove_S7的博客 5444

STM32F401RCT6最小系统原理图设计

STM32F401RCT6最小系统原理图设计一、主控芯片二、电源电路三、晶振电路三、下载电路四、完整电路图      本文章基于STM32F401RCT6进行最小系统原理图设计,包含主控芯片,电源,晶振电路,下载电路等几部分 一、主控芯片 主控芯片采用STM32F401RCT6,需注意: VBAT在不接电池的情况下需接3.3V,VDDAVREF+需接3.3V,否则会造成芯片供电不正常,无法启动和识别的情况 VDDAVREF+和VCAP1处电容需按照规格书

weixin_43278295的博客 2万+

C++实现设计ATM机系统

这个示例实现了一个基本的ATM机系统,支持注册、登录、存款、取款、查询余额和保存数据等功能。当然,这只是一个简单的ATM机模拟,实际的ATM机系统需要更复杂的逻辑和更严格的安全措施。C++编写一个简单的ATM机系统,我将提供一个基本的实现示例,但由于ATM机系统的复杂性和安全性要求,这只是一个简单的模拟,不适合在实际环境中使用。试设计一简单模拟ATM机系统,系统以菜单方式工作,采用自定义函数设计各功能模块被主菜单调用,使之能提供以下基本选项。=========欢迎使用ATM=========

走向CTO的路上... 1241

全面吃透JAVA Stream流操作,让代码更加的优雅

笔者结合在团队中多年的代码检视遇到的情况,结合平时项目编码实践经验,对Stream的核心要点与易混淆用法、典型使用场景等进行了详细的梳理总结,希望可以帮助大家对Stream有个更全面的认知,也可以更加高效的应用到项目开发中去。 ...

是Vzn呀 2537

编程助手:CLAUDE.md 与 AGENTS.md 完全指南

AI编程助手配置文件指南 为解决AI编程助手在陌生项目中面临的运行、规范、架构等问题,本文提出两种配置文件: CLAUDE.md(根目录): 面向通用AI(如ClaudeCode) 包含项目命令、代码风格、架构说明等结构化信息 示例:启动命令:npm run dev,代码规范:TypeScript禁用any AGENTS.md(任意目录): 面向智能编码工具(如Cursor) 支持模块级配置(如微前端子应用) 示例:前端测试命令:npm test:web,API请求规范 与传统README.md的区别: 人

分享AI、区块链技术及应用,未来已来 1245

基础篇:JAVA.Stream函数,优雅的数据流操作

前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看。java提供了Stream的概念,它可以让我们把集合数据当做一个个元素在处理,并且提供多线程模式 流的创建 流的各种数据操作 流的终止操作 流的聚合处理 并发流和CompletableFuture的配合使用

潜行前行的专栏 3030

SLAM Cartographer(18)后端优化问题求解器

了解经过闭环检测构建了子图与节点之间的约束之后,通过后端优化求解器进行优化求解。核心是基于Ceres库进行SPA(Sparse Pose Adjustment)的优化方法,把后端优化问题描述成为一个最小二乘的问题求解

氢键H-H 5679

OSG三维渲染引擎编程学习之一:“第一章:OSG介绍” 之 “1.1 OSG简介”

第一章:OSG介绍; 1.1 OSG简介。

LuckyHanMo的博客 3220

【Java 8 新特性】Java Stream通过peek()为每个元素提供消费函数

【Java 8 新特性】Java Stream通过peek在调用子元素时执行方法1. Stream.peek() : 是一个中间操作(`An Intermediate Operation`)2.peek()示例`peek()`并行流(`Parallel Stream`)示例Java 9中的`peek()`和`count()`参考文献 本页将介绍Stream.peek方法示例。 peek方法返回由该流的元素组成的流,并对每个元素执行所提供的Consumer操作方法。 peek是一个中间操作方法。 从javad

猫巳的博客 5万+

快速卷积结构FIR数字滤波器的设计与ARM平台实现

本文提出了一种基于快速卷积结构的FIR数字滤波器设计与实现方案。通过Matlab设计了满足特定指标的低通FIR滤波器,采用重叠-保存法和重叠-相加法两种快速卷积算法,将计算复杂度从O(N·M)降低到O(NlogN)。详细介绍了滤波器系数生成、性能验证流程,并提供了ARM平台C语言实现的关键技术,包括定点量化处理。实验结果表明,该方法能有效滤除混合信号中的高频干扰,保留目标1kHz正弦信号,验证了设计方案的有效性。

huanghm88的专栏 121

并发编程:并行反应式流:排序流(sorted、unordered)

主要内容 sorted() 排序流(Stream中的元素需要实现Comparable接口,否则传入Comparator参数对元素进行排序) unordered() 消除相遇顺序(以提升并行流的性能)注:并行流在处理有序数据结构时,性能会有很大影响) forEachOrdered 如果使用forEach方法,是不会考虑相遇顺序的,若要输出有序的元素,则使用forEachOrdered方法。 一、主程序 package xyz.jangle.thread.test.n6_8.sorted; impo

博风_刺耳的博客(网络记事本) 1659

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

收集流中的元素,collect方法

博风_刺耳的博客(网络记事本) 898

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

并发编程:并行反应式流:验证流(allMatch)

验证流 allMatch、anyMatch、noneMatch

博风_刺耳的博客(网络记事本) 725

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

并发编程:并行反应式流:转换流(map、flatMap)

转换流,map、flatMap。 将普通的Stream转换为特殊的IntStream,LongStream、DoubleStream。

博风_刺耳的博客(网络记事本) 794

Java线程基础与并发编程实践指南

线程作为操作系统调度的基本单位,是Java并发编程的核心概念。从JVM视角看,每个线程对应一个Thread实例,共享进程资源但独立执行。理解线程生命周期(NEW、RUNNABLE、BLOCKED等状态)和同步机制(synchronized、volatile、Lock)是开发线程安全应用的基础。在Java生态中,线程池(ThreadPoolExecutor)通过核心参数配置实现任务高效调度,而AQS框架则为锁实现提供底层支持。实际开发中,应优先使用ConcurrentHashMap等并发容器,遵循减少锁粒度、

weixin_34208283的博客 365

Java编程的逻辑 (92) - 函数式数据处理 (上)

本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http://item.jd.com/12299018.html 上节我们介绍了Lambda表达式和函数式接口,本节探讨它们的应用,函数式数据处理,针对常见的集合数据处理,Java 8引入了一套新的类库,位于包java....

weixin_33817333的博客 229

【java】jdk8的一些新特性

与stream().forEach功能类似,不同点在于peek返回原始的stream()流,因而可以反复调用,forEach没有返回值。

weixin_42482624的博客 194

ai人工智能翻车现场、有图有真相

ai人工智能翻车现场、有图有真相

enthan809882的博客 2102

并发编程:并行反应式流:遍历流(forEach,forEachOrdered)

遍历流(forEach , forEachOrdered)

博风_刺耳的博客(网络记事本) 1710

java stream

java stream

global_coding的博客 363

Java——Stream流的peek方法详解

peek()方法的定义在在Java的StreamAPI中,peek()方法是一个强大的工具,它允许我们在流的处理中观察和调试数据,特别是在数据处理链比较长的情况下,它可以帮助我们跟踪流中元素的状态和变化。但需要注意的是,peek()不能用于修改流的元素,更多地是用作调试、记录日志和数据检查的手段。通过丰富的代码示例,我们了解了peek()的常见使用场景和注意事项。在实际开发中,合理使用peek()可以极大地帮助我们调试和监控流操作,希望本文能帮助你深入理解并掌握peek()的使用。

小蜗牛的珍贵百宝箱 1万+

【Java没基础】Java 8 并行流 ParallelStream

在前两篇的 Java 8 函数式编程的 blog 中,我们聊了 Lambda 表达式,聊了一些常用的 Stream API 和一些收集器方法。在今天,我们要考虑一下效率了。

一步一个脚印 2586

【Stream流-遇到的问题】

根本原因通常是 peek()

qq_52959191的博客 1008
上一篇: 并发编程:fork/join框架:取消一个任务
下一篇: 并发编程:并行反应式流:归约流(MapReduce)
博风
博客等级 码龄16年 442粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值