第三章 Stream流 关注公众号(CoderBuff)回复“stream”获取《Java8 Stream编码实战》PDF完整版。...《Java8 Stream编码实战》的代码全部在https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/stream-coding...对于初学者,必须要声明一点的是,Java8中的Stream尽管被称作为“流”,但它和文件流、字符流、字节流完全没有任何关系。Stream流使程序员得以站在更高的抽象层次上对集合进行操作[1]。...也就是说Java8中新引入的Stream流是针对集合的操作。 3.1 迭代 我们在使用集合时,最常用的就是迭代。...最大的功劳当属Java8新提供的类——Collectors收集器。 Collectors不但有toList方法能将流转换为集合,还包括toMap转换为Map数据类型,还能分组。
2.1 筛选与切片 filter——接收lamdba,从流中排除某些元素 @Test void test12(){ List personList = Arrays.asList...System.out::println); } skip(n)——跳过元素,返回一个扔掉前n个元素的流,若不足n个,则返回一个空流。...,然后把所有流生成一个流。...)/reduce(BinaryOperator)——可以将流中元素反复结合起来,得到一个值。...* reduce 第一个参数是起始值 */ @Test void test16(){ List list = Arrays.asList(1,2,3,4,5,6,7,8,9,10
在 Java 7 之前,如果想要并行处理一个集合,我们需要以下几步 1. 手动分成几部分 2. 为每部分创建线程 3. 在适当的时候合并 并且还需要关注多个线程之间共享变量的修改问题。...而 Java8 为我们提供了并行流,可以一键开启并行模式。是不是很酷呢?让我们来看看。..." + result); if (duration < fastest) fastest = duration; } return fastest; } }` 共享变量修改的问题...并行流虽然轻易的实现了多线程,但是仍未解决多线程中共享变量的修改问题。...因此当代码中存在修改共享变量的操作时,是不建议使用并行流的。
一、前言 这一节我们来看下Java8的又一新特性:流。...什么是流 1.1 定义 从支持数据处理操作的源生成的元素序列 元素序列 就像集合一样, 流也提供了一个接口, 可以访问特定元素类型的一组有序值。...例如, 以下代码会抛出一个异常, 说流已被消费掉了: List title = Arrays. asList(" Java8", "In", "Action"); Stream< String...1000); anyMatch、 allMatch 和 noneMatch 这三个操作都用到了我们所谓的短路, 这就是大家熟悉的 Java 中&& 和|| 运算符短路在流中的版本。...它们主要提供了三大功能: 将流元素归约和汇总为一个值 -元素分组 -元素分区 下文中,我们假定你已导入了 Collectors 类的所有静态工厂方法: import static java. util
2.1 筛选与切片 filter——接收lamdba,从流中排除某些元素 1@Test 2void test12(){ 3 List personList = Arrays.asList....forEach(System.out::println); 11} skip(n)——跳过元素,返回一个扔掉前n个元素的流,若不足n个,则返回一个空流。...,然后把所有流生成一个流。...System.out.println(b.get()); 10} findAny——返回当前流中的任意元素 1@Test 2void test15(){ 3 List...T identity, BinaryOperator)/reduce(BinaryOperator)——可以将流中元素反复结合起来,得到一个值。
---- Pre Java 8 - Stream流骚操作解读2_归约操作操作了reduce, 使用 reduce 方法计算流中元素的总和....---- 原始类型流特化 Java 8引入了三个原始类型特化流接口来解决这个问题: IntStream 、 DoubleStream 和LongStream ,分别将流中的元素特化为 int 、 long...但是,如果你要计算 IntStream 中的最大元素,就得换个法子了,因为 0 是错误的结果。如何区分没有元素的流和最大值真的是 0 的流呢?...Java 8引入了两个可以用于 IntStream 和 LongStream 的静态方法,帮助生成这种范围range 和 rangeClosed 。...使用 map 和 flatMap 提取或转换流中的元素 使用 findFirst 和 findAny 方法查找流中的元素。
一、流是什么? 流 ( Stream ) 是 Java 8 新增加的一个重磅级的功能。...Java 中的 流 ( Stream ) 表示来自 源 ( source ) 的一系列对象,它支持统计、求和、求平均值等聚合操作。...二、流的创建 Java 8 在推出流的同时,对集合框架也进行了一些比较大变更。...三、流支持的聚合操作 forEach方法 Java 8 为 Stream 提供了一种新方法 forEach(),用于迭代流的每个元素。...8 同时新增了大量的统计收集器来来获取流中的元素的一些统计信息。
流操作demo package com.example.mapper; import org.junit.Before; import org.junit.Test; import java.util....*; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream...过滤流中的元素 */ @Test public void testFilter() { Integer[] arr = new Integer[]{1, 2,...Comparator.comparing(String::length)).forEach(System.out::println); } /** * 倒序 * reversed(),java8...* 对并行流十分有效 * 只要在任何片段发现了第一个匹配元素就会结束整个运算 */ @Test public void testFindAny(){
在1.8新特性中有一个stream流 可以对集合进行很多操作,在开发里大量用到 先创建两个类,用于我们操作 import java.util.ArrayList; /** * @ClassName:...import java.util.*; import java.util.stream.Collectors; /** * @ClassName: StreamDemo * @Date: 2020...()以count()及搭配计算出空字符串的个数 //parallelStream:返回一个可能的平行Stream与此集合作为其源,这是允许的这个方法返回一个连续的数据流....filter(String::isEmpty).count()); //limit()和sql里的limit相似,可以截取数据数量 //只取头两条,并且筛选不为空的元素...string.isEmpty()).forEach(System.out::println); //distinct()去除重复元素 joining() 在之间添加元素
流的终止操作 ---- 一、概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。...不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。...(保留意见:毕竟peek方法可以修改流中元素) 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。...流的中间操作 2.1 筛选与切片 filter:过滤流中的某些元素 limit(n):获取n个元素 skip(n):跳过n元素,配合limit(n)可实现分页 distinct:通过流中元素的 hashCode...,第二个参数为流中元素的第二个元素;第二次执行时,第一个参数为第一次函数执行的结果,第二个参数为流中的第三个元素;依次类推。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。...Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。...这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。...元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。...,返回true allMatch表示,判断条件里的元素,所有的都是,返回true noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true public static
创建流的方法有很多,常见的如: 从Collection集合创建 根据数值范围创建数值流 从一系列值 从数组 从文件 由函数来生成无限流 一、 从Collection集合 Stream...stream(); Stream stringStream = new ArrayList() .stream(); 二、 根据数值范围创建数值流...IntStream intStream = IntStream.rangeClosed(1, 100); 三、 从一系列值 Stream提供了一个静态方法来根据一系列值生成一个流 Stream<Integer...AppleStream(); Stream appleStream = Stream.of(apple, apple, apple); 四、 从数组 //重载了支持特定的基本类型流...六、由函数来生成无限流 Java8提供了Stream.iterate()和Stream.generate()来生成无限流,这两个方法会根据给定的表达式来生成包含无限个数据的流,所以一般结合limit()
并行流与串行流 1、概述 2、实例 1、概述 并行流就是把一个内容分成多个数据块,并用不同的线程分 别处理每个数据块的流。 Java 8 中将并行进行了优化,我们可以很容易的对数据进行并 行操作。...Stream API 可以声明性地通过 parallel() 与 sequential() 在并行流与顺序流之间进行切换。...long end = System.currentTimeMillis(); System.out.println("耗费的时间为: " + (end - start)); 2、采用并行流计算...,是因为并行流执行的时候会递归将计算进行差分,最后再将拆分的结果合并,会消耗掉一部分时间。...加大数据量,计算从0到10000000000L 1、普通累加和: 2、并行流计算 可以看到,数据已经溢出了,但是我们观察消耗时间可以发现,数据量越大,并行流的优势越明显
翎野君/文 流的概念 1.流是什么 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。...2.流简介 ‘流’的简单定义就是“从支持数据处理操作的源生成的元素序列”。 元素序列——就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。...请注意,从有序集 合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。...相比之下,流则是在概念上固定的数据结构(你不能添加或删除元素),其元素则是按需计算的。 从另一个角度来说,流就像是一个延迟创建的集合:只有在消费者要求的时候才会计算值。...使用for-each循环外部迭代 使用其背后的迭代器做外部迭代 使用流做内部迭代 流操作 java.util.stream.Stream中的Stream接口定义了许多操作。
java8-Stream Api流详解 1 Stream API的意义 流的定义:通俗地说,不用再写循环,判断等细节实现的代码,直接以声明式方式编写你的意图。节省了大量的中间容器去存储临时的中间变量。...流有序的话,会顺序返回前N个元素,否则随机返回。 skip(n)跳过操作,跳过前n个元素的流,如果元素为空,则返回一个空流。...3.2.2 映射 map(T->R)映射操作,将流中的每一个元素映射成一个新元素,转换成另一个对象。...(特别是数组或者集合种的元素)转换成一个个流,并合并成一个流,多层嵌套瞬间拍平。...p2 : p1)); if (collect8.isPresent()){ System.out.println(collect8.get()); } // 取平均数 // 取平均数 final
Java8新特性stream流 一、包装数据类型 @Test public void main22() { List list = new ArrayList...(){{ add(7); add(5); add(1); add(2); add(8); add(4); add(3); add(6); add(3);...去重 List distinctList = list.stream().distinct().collect(Collectors.toList()); // 对每个元素进行操作
使用流 本文demo源码: https://github.com/Ryan-Miao/someTest/tree/master/src/main/java/com/test/java8/streams...package com.test.java8.streams.entity; /** * Created by Ryan Miao on 12/11/17. */ public class Dish...package com.test.java8.streams; import com.google.common.collect.Lists; import com.test.java8.streams.entity.Dish...而peek里,我们可以修改当前对象的属性,也是会生效的。 流的扁平化faltMap 我们前面讲的函数都是处理一个序列,一个list,一个Stream里的数据。...注 以上内容均来自《Java8 In Action》。
在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱。虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面。...Java8引入了3个原始类型特化流接口来解决这个问题:IntStream,DoubleStream,LongStream, 分别将流中的元素特化为int、long、doub,从而避免了暗含的装箱成本。...将对象流映射为数值流 常用方法为mapToInt, mapToDouble, mapToLong,这些方法和map相同,只是它们返回一个特化流,而不是Stream。...range = IntStream.range(1, 9); 注 测试demo: https://github.com/Ryan-Miao/someTest/blob/master/src/main/java.../com/test/java8/streams/NumStreamExample.java 以上出自《Java8 In Action》
在Java 7之前,并行处理数据集合非常麻烦。 第一,你得明确地把包含数据的数据结构分成若干子部分。 第二,你要给每个子部分分配一个独立的线程。...它允许你声明性地将顺序流变为并行流。 另外我们也要关注流是如何在幕后应用Java 7引入的分支/合并框架的。 同时了解并行流内部是如何工作的很重要,避免因误用而得到意外的(很可能是错的)结果。...---- 什么是并行流 前面我们简要地提到了 Stream 接口可以让你非常方便地处理它的元素:可以通过对收集源调用 parallelStream 方法来把集合转换为并行流。...大小,例如 System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","12"); 这是一个全局参数,因此它将影响代码中所有的并行流...反过来说,目前还无法专门为某个并行流指定这个值。一般而言,让 ForkJoinPool 的大小等于处理器数量是个不错的默认值,除非你有很好的理由,否则不建议修改它。
我将要在这三块基石上建立我成功的金字塔——(法)巴斯德 之前写过一个关于stream流的博客,这次再做个补充吧 // 取出第一条,没取到则为0 Integer first = someNumber.stream
领取专属 10元无门槛券
手把手带您无忧上云