1. Java Stream 概述

本文介绍了Java 8的Stream API,它为处理集合提供了声明式方式,使得代码更简洁易读。Stream可以进行过滤、排序、聚合等操作,并具有延迟计算特性。通过集合、数组或Stream的静态方法可以创建流,同时存在顺序流和并行流。文章还展示了如何使用中间操作和终端操作,并通过示例解释了stream和parallelStream的区别。

Stream,配合Lambda ,给我们操作集合(Collection)提供了极大的便利。

Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集合的一个高级迭代器。

Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。

1、使用流的好处

代码以声明性方式书写,说明想要完成什么,而不是说明如何完成一个操作。

可以把几个基础操作连接起来,来表达复杂的数据处理的流水线,同时保持代码清晰可读。

2、流是什么?

从支持数据处理操作的源生成元素序列.数据源可以是集合,数组或IO资源。

从操作角度来看,流与集合是不同的. 流不存储数据值; 流的目的是处理数据,它是关于算法与计算的。

如果把集合作为流的数据源,创建流时不会导致数据流动; 如果流的终止操作需要值时,流会从集合中获取值; 流只使用一次。

流中心思想是延迟计算,流直到需要时才计算值。

 

Stream可以由数组或集合创建,对流的操作分为两种:

中间操作,每次返回一个新的流,可以有多个。

终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。

另外,Stream有几个特性:

stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。

stream不会改变数据源,通常情况下会产生一个新的集合或一个值。

stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

二、Stream的创建

Stream可以通过集合数组创建。

1、通过 java.util.Collection.stream() 方法用集合创建流

List list = Arrays.asList("a", "b", "c");

// 创建一个顺序流

Stream stream = list.stream();

// 创建一个并行流

Stream parallelStream = list.parallelStream();

2、使用java.util.Arrays.stream(T[] array)方法用数组创建流

int[] array={1,3,5,6,8};

IntStream stream = Arrays.stream(array);

3、使用Stream的静态方法:of()、iterate()、generate()

Stream stream = Stream.of(1, 2, 3, 4, 5, 6);

Stream stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);

stream2.forEach(System.out::println);

Stream stream3 = Stream.generate(Math::random).limit(3);

stream3.forEach(System.out::println);

输出结果:

0 3 6 9

0.6796156909271994

0.1914314208854283

0.8116932592396652

stream和parallelStream的简单区分: stream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:

 

如果流中的数据量足够大,并行流可以加快处速度。

除了直接创建并行流,还可以通过parallel()把顺序流转换成并行流:

Optional findFirst = list.stream().parallel().filter(x->x>6).findFirst();

 3. stream 的API

 

14:25:21.623 [rmFlowTaskDataTaskCli-1] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [SessionImpl(347877159<open>)] after transaction 14:25:21.623 [rmEsRmDataTaskCli-1] ERROR com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatTask - 处理RM_ES_TABLE数据失败,rmDataYearId:TEST_1762151121301 javax.persistence.TransactionRequiredException: Executing an update/delete query at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:413) at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1608) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:409) at com.sun.proxy.$Proxy113.executeUpdate(Unknown Source) at com.hd.rcugrc.product.oa.data.service.impl.RmCommonService.exceuteSql(RmCommonService.java:168) at com.hd.rcugrc.product.oa.data.handle.service.impl.EsDataInitHandleServiceImpl.updateTableDataInitStatus(EsDataInitHandleServiceImpl.java:98) at com.hd.rcugrc.product.oa.data.handle.service.impl.EsDataInitHandleServiceImpl.initRmEsData(EsDataInitHandleServiceImpl.java:48) at com.hd.rcugrc.product.oa.data.handle.service.impl.DataInitializationServiceImpl.initRemoveEsData(DataInitializationServiceImpl.java:377) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205) at com.sun.proxy.$Proxy101.initRemoveEsData(Unknown Source) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatTask.run(InitYearDataTableCatTask.java:141) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl.executeTask(InitYearDataTableCatDelayTaskExecutorImpl.java:164) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl.lambda$0(InitYearDataTableCatDelayTaskExecutorImpl.java:134) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 14:25:21.623 [rmFlowTaskDataTaskCli-1] ERROR com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatTask - 处理FLOW_TASK_TABLE数据失败,rmDataYearId:TEST_1762151121301 java.lang.NullPointerException: null at java.util.Arrays.stream(Arrays.java:5004) at java.util.stream.Stream.of(Stream.java:1000) at com.hd.rcugrc.product.oa.data.handle.service.impl.CommonDataInitHandleServiceImpl.initAllTableData(CommonDataInitHandleServiceImpl.java:86) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy98.initAllTableData(Unknown Source) at com.hd.rcugrc.product.oa.data.handle.service.impl.DataInitializationServiceImpl.initFlowTaskData(DataInitializationServiceImpl.java:397) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205) at com.sun.proxy.$Proxy101.initFlowTaskData(Unknown Source) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatTask.run(InitYearDataTableCatTask.java:137) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl.executeTask(InitYearDataTableCatDelayTaskExecutorImpl.java:164) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl.lambda$0(InitYearDataTableCatDelayTaskExecutorImpl.java:134) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 14:25:21.624 [rmEsRmDataTaskCli-1] DEBUG com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl - inner finally, unlock rmEsRmDataTaskLock. 14:25:21.624 [rmFlowTaskDataTaskCli-1] DEBUG com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl - inner finally, unlock rmFlowTaskDataTaskLock. 14:25:21.624 [rmEsRmDataTaskCli-1] DEBUG com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl - outer finally, unlock rmEsRmDataTaskLock. 14:25:21.624 [rmFlowTaskDataTaskCli-1] DEBUG com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl - outer finally, unlock rmFlowTaskDataTaskLock. 14:25:21.624 [rmEsRmDataTaskCli-1] ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task org.redisson.RedissonShutdownException: Redisson is shutdown at org.redisson.command.RedisExecutor.execute(RedisExecutor.java:110) at org.redisson.command.CommandAsyncService.async(CommandAsyncService.java:606) at org.redisson.command.CommandAsyncService.writeAsync(CommandAsyncService.java:591) at org.redisson.RedissonBaseLock.isExistsAsync(RedissonBaseLock.java:263) at org.redisson.RedissonObject.isExists(RedissonObject.java:231) at org.redisson.RedissonBaseLock.isLocked(RedissonBaseLock.java:253) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl.executeTask(InitYearDataTableCatDelayTaskExecutorImpl.java:178) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl.lambda$0(InitYearDataTableCatDelayTaskExecutorImpl.java:134) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 14:25:21.624 [rmFlowTaskDataTaskCli-1] ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task org.redisson.RedissonShutdownException: Redisson is shutdown at org.redisson.command.RedisExecutor.execute(RedisExecutor.java:110) at org.redisson.command.CommandAsyncService.async(CommandAsyncService.java:606) at org.redisson.command.CommandAsyncService.writeAsync(CommandAsyncService.java:591) at org.redisson.RedissonBaseLock.isExistsAsync(RedissonBaseLock.java:263) at org.redisson.RedissonObject.isExists(RedissonObject.java:231) at org.redisson.RedissonBaseLock.isLocked(RedissonBaseLock.java:253) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl.executeTask(InitYearDataTableCatDelayTaskExecutorImpl.java:178) at com.hd.rcugrc.product.oa.data.handle.task.InitYearDataTableCatDelayTaskExecutorImpl.lambda$0(InitYearDataTableCatDelayTaskExecutorImpl.java:134) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 14:25:23.176 [redisson-timer-4-1] DEBUG org.redisson.command.RedisExecutor - connection released for command (HGET) and params [oaRmDataTableCache, PooledUnsafeDirectByteBuf(ridx: 0, widx: 16, cap: 256)] from slot NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null] using connection RedisConnection@1009181943 [redisClient=[addr=redis://redistest.hd.com:6379], channel=[id: 0x4337e552, L:/127.0.0.1:61209 ! R:redistest.hd.com/127.0.0.1:6379], currentCommand=CommandData [promise=RedissonPromise [promise=ImmediateEventExecutor$ImmediatePromise@41c62416(incomplete)], command=(QUIT), params=[], codec=null]] 14:25:23.176 [redisson-timer-4-1] DEBUG org.redisson.command.RedisExecutor - attempt 1 for command (HGET) and params [oaRmDataTableCache, PooledUnsafeDirectByteBuf(ridx: 0, widx: 16, cap: 256)] 14:25:23.177 [redisson-timer-4-1] DEBUG org.redisson.command.RedisExecutor - connection released for command (HGET) and params [oaRmDataTableCache, PooledUnsafeDirectByteBuf(ridx: 0, widx: 16, cap: 256)] from slot NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null] using connection RedisConnection@1745450943 [redisClient=[addr=redis://redistest.hd.com:6379], channel=[id: 0x11494f8b, L:/127.0.0.1:61211 ! R:redistest.hd.com/127.0.0.1:6379], currentCommand=CommandData [promise=RedissonPromise [promise=ImmediateEventExecutor$ImmediatePromise@310584cf(incomplete)], command=(QUIT), params=[], codec=null]] 14:25:23.177 [redisson-timer-4-1] DEBUG org.redisson.command.RedisExecutor - attempt 1 for command (HGET) and params [oaRmDataTableCache, PooledUnsafeDirectByteBuf(ridx: 0, widx: 16, cap: 256)] 14:25:23.177 [redisson-timer-4-1] DEBUG org.redisson.command.RedisExecutor - connection released for command (HGET) and params [oaRmDataTableCache, PooledUnsafeDirectByteBuf(ridx: 0, widx: 16, cap: 256)] from slot NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null] using connection RedisConnection@233290384 [redisClient=[addr=redis://redistest.hd.com:6379], channel=[id: 0x167bc4ff, L:/127.0.0.1:61212 ! R:redistest.hd.com/127.0.0.1:6379], currentCommand=CommandData [promise=RedissonPromise [promise=ImmediateEventExecutor$ImmediatePromise@4ffd80d8(incomplete)], command=(QUIT), params=[], codec=null]] 14:25:23.177 [redisson-timer-4-1] DEBUG org.redisson.command.RedisExecutor - attempt 1 for command (HGET) and params [oaRmDataTableCache, PooledUnsafeDirectByteBuf(ridx: 0, widx: 16, cap: 256)] 14:25:23.177 [redisson-timer-4-1] DEBUG org.redisson.command.RedisExecutor - connection released for command (EVAL) and params [if ARGV[4] == '1' then redis.call('publish', KEYS[2], ARGV[3]); end;if ARGV[4] == '2' then redis.cal..., 3, oaRmDataTableCache, {oaRmDataTableCache}:topic, redisson__cache_updates_log:{oaRmDataTableCache}, PooledUnsafeDirectByteBuf(ridx: 0, widx: 16, cap: 256), PooledUnsafeDirectByteBuf(ridx: 0, widx: 369, cap: 512), PooledUnsafeDirectByteBuf(ridx: 0, widx: 37, cap: 256), 2, 1762151121599, ...] from slot NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null] using connection RedisConnection@1272847902 [redisClient=[addr=redis://redistest.hd.com:6379], channel=[id: 0x2e68157d, L:/127.0.0.1:61210 ! R:redistest.hd.com/127.0.0.1:6379], currentCommand=CommandData [promise=RedissonPromise [promise=ImmediateEventExecutor$ImmediatePromise@44bc7c77(incomplete)], command=(QUIT), params=[], codec=null]] 14:25:23.177 [redisson-timer-4-1] DEBUG org.redisson.command.RedisExecutor - attempt 1 for command (EVAL) and params [if ARGV[4] == '1' then redis.call('publish', KEYS[2], ARGV[3]); end;if ARGV[4] == '2' then redis.cal..., 3, oaRmDataTableCache, {oaRmDataTableCache}:topic, redisson__cache_updates_log:{oaRmDataTableCache}, PooledUnsafeDirectByteBuf(ridx: 0, widx: 16, cap: 256), PooledUnsafeDirectByteBuf(ridx: 0, widx: 369, cap: 512), PooledUnsafeDirectByteBuf(ridx: 0, widx: 37, cap: 256), 2, 1762151121599, ...] 14:25:23.179 [redisson-netty-2-1] DEBUG io.netty.buffer.PoolThreadCache - Freed 4 thread-local buffer(s) from thread: redisson-netty-2-1
最新发布
11-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值