java stream sql_Java Stream的基本用法

论坛 期权论坛     
选择匿名的用户   2021-5-26 12:32   371   0
<div style="font-size:16px;">
<p>Java Stream的基本用法</p>
<p>项目遇到一个需求,需要对集合 List 进行遍历、筛选,按照传统的写法,就是直接 for 循环进行条件判断,这样的做法很是啰嗦麻烦,Java8 Stream 流操作能够简洁地解决这个问题。网上对于 Stream 的介绍及相关用法很详细,这里列举简单的用法。</p>
<p>1、Stream介绍</p>
<p>Stream 是 Java 8 的新特性之一,它能够将数组、集合转换成流,借助Stream API 对流中的元素进行操作,比如筛选、排序、聚合等。这种对流中数据的操作,类似于使用SQL执行的数据库查询。</p>
<p>Stream 有下面几个特性:</p>
<p>stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。</p>
<p>stream不会改变数据源,通常情况下会产生一个新的集合或一个值。</p>
<p>stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。</p>
<p>2、Stream操作分类</p>
<p>Stream可以由数组或集合创建,对流的操作分为两种:</p>
<p>中间操作:每次返回一个新的流,可以有多个。</p>
<p>终端操作:每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。</p>
<p align="center"><img alt="29896e55092feaf8bf0c5d44933aeeb8.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-c6bbe83349062a70428ae5fe1851fab4.png"></p>
<p align="center"><img alt="29d66650908dd8305c77e77e1c531763.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-5df7385ae5d5f7517388af1669c31d27.png"></p>
<p>3、Stream 创建</p>
<p>Stream可以由数组、集合创建</p>
<p>3.1、通过 java.util.Collection.stream() 方法用集合创建流</p>
<p>List list &#61; Arrays.asList(&#34;hello&#34;,&#34;world&#34;,&#34;stream&#34;);</p>
<p>//创建顺序流</p>
<p>Stream stream &#61; list.stream();</p>
<p>//创建并行流</p>
<p>Stream parallelStream &#61; list.parallelStream();</p>
<p>3.2、使用java.util.Arrays.stream(T[] array)方法用数组创建流</p>
<p>String[] array &#61; {&#34;h&#34;, &#34;e&#34;, &#34;l&#34;, &#34;l&#34;, &#34;o&#34;};</p>
<p>Stream arrayStream &#61; Arrays.stream(array);</p>
<p>3.3、使用Stream的静态方法:of()、iterate()、generate()</p>
<p>Stream stream1 &#61; Stream.of(1, 2, 3, 4, 5, 6);</p>
<p>Stream stream2 &#61; Stream.iterate(0, (x) -&gt; x &#43; 2).limit(3);</p>
<p>stream2.forEach(System.out::println);</p>
<p>Stream stream3 &#61; Stream.generate(Math::random).limit(3);</p>
<p>stream3.forEach(System.out::println)</p>
<p>输出结果如下:</p>
<p>0</p>
<p>2</p>
<p>4</p>
<p>0.9620319103852426</p>
<p>0.8303672905658537</p>
<p>0.09203215202737569</p>
<p>3.4、stream和parallelStream的简单区分</p>
<p>stream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:</p>
<p align="center"><img alt="63a3666d4fe235d6e6c087b7dd28672c.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-4f679b11e9cf1618efafd68561768235.png"></p>
<p>如果流中的数据量足够大,并行流可以加快处速度。</p>
<p>除了直接创建并行流,还可以通过parallel()把顺序流转换成并行流:</p>
<p>Optional findFirst &#61; list.stream().parallel().filter(x-&gt;x&gt;4).findFirst();</p>
<p>4、Stream 使用</p>
<p>4.1 遍历/匹配(foreach/find/match)</p>
<p>Stream也是支持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的。Stream的遍历、匹配非常简单。</p>
<p>Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。后面会出关于&#39;Optional类的博客。</p>
<p align="center"><img alt="0c1203a161db9702ae944950d63e518b.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-f684ee6cb91b4a2aa3393d4a28440569.png"></p>
<p>public static void main(String[] args) {<!-- --></p>
<p>List list &#61; Arrays.asList(7, 6, 9, 3, 8, 2, 1);</p>
<p>// 遍历输出符合条件的元素</p>
<p>list.stream().filter(x -&gt; x &gt; 6).forEach(System.out::println);</p>
<p>// 匹配第一个</p>
<p>Optional findFirst &#61; list.stream().filter(x -&gt; x &gt; 6).findFirst();</p>
<p>// 匹配任意(适用于并行流)</p>
<p>Optional findAny &#61; list.parallelStream().filter(x -&gt; x &gt; 6).findAny();</p>
<p>// 是否包含符合特定条件的元素</p>
<p>boolean anyMatch &#61; list.stream().anyMatch(x -&gt; x &lt; 6);</p>
<p>System.out.println(&#34;匹配第一个值:&#34; &#43; findFirst.get());</p>
<p>System.out.println(&#34;匹配任意一个值:&#34; &#43; findAny.get());</p>
<p>System.out.println(&#34;是否存在大于6的值:&#34; &#43; anyMatch);</p>
<p>}</p>
<p>4.2 筛选(filter)</p>
<p>筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP