`
等牛奶的咖啡
  • 浏览: 7460 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK8 Stream

    博客分类:
  • JAVA
 
阅读更多

1. Stream

Stream 是元素的集合,类似 Iterator,但行为和集合类又有所不同,是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。Stream 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。

 

2. 用法

2.1 创建 Stream

Stream<Integer> s1 = Stream.of(1);
Stream<Integer> s2 = Stream.of(2, 3, 4);

Stream<Double> s3 = Stream.generate(Math::random);

Stream.iterate(1, x -> x + 1).limit(10).forEach(System.out::print);

List<Integer> x = Lists.newArrayList();
Stream<Integer> s4 = x.stream();

四个方法,两种方式

第一种方式,of、generate、iterate,静态工厂方法,区别在于参数的不同

第二种方式,Collection 接口有一个 stream 方法

 

2.2 distinct、count、limit、sorted、max、min

Stream<Integer> s = Stream.of(1, 2, 3, 4, 5, 1);

// 去重、排序、截断、计算个数
System.out.println(s.distinct().sorted((o1,o2) -> o1.compareTo(o2)).limit(3).count());

System.out.println(s.max((o1, o2) -> o1.compareTo(o2)).get());
System.out.println(s.min((o1, o2) -> o1.compareTo(o2)).get());

 这几个方法从方法名上就能理解它的意思

 

2.3  map、mapToInt、mapToLong、mapToDouble

Stream<Integer> s = Stream.of(1, 2, 3, 4);

s.map(x -> x * 2).forEach(System.out::print);
s.mapToInt(x -> x).forEach(System.out::print);
s.mapToLong(x -> x).forEach(System.out::print);
s.mapToDouble(x -> x).forEach(System.out::print);

 map 对于 Stream 中包含的元素使用给定的转换函数进行转换操作,新生成的 Stream 只包含转换生成的元素。mapToInt、mapToLong、mapToDouble 将新生成的元素转换成特定的类型

 

2.4 flatMap、flatMapToInt、flatMapToLong、flatMapToDouble

List<Integer> testList0 = Lists.newArrayList(1, 2, 3, 4);
List<Integer> testList1 = Lists.newArrayList(6, 7, 8, 9);

testList0.stream().flatMap(x -> {
        if(x == 1 || x ==3)
                return testList1.stream().skip(x);
        else
                return null;
}).forEach(System.out::print);     // 7899

flatMap 的参数为 Function<? super T, ? extends Stream<? extends R>> mapper 也就是定义一个 Function,这个 Function 的入参是 Stream 中的元素类型,返回的是另一个Stream,其作用和 map 的类似,都是循环元素,不同在返回,map 返回一个对象,flatMap 返回一个 Stream

 

2.5  allMatch、noneMatch、anyMatch

findFirst、findAny、filter

Stream<Integer> s = Stream.of(1, 2, 3, 4);

Predicate<Integer> p = x -> x > 2;

s.allMatch(p);  // false
s.noneMatch(p); // false
s.anyMatch(p);  // true

s.findFirst().orElse(0);    // 1
s.findAny().orElse(0);      //1

s.filter(p).findFirst().orElse(0);  //3

 根据判断条件 Predicate 查询,获取对应的元素,match 用于匹配,filter 用作过滤

 

2.6 skip、peek、collect

Stream<Integer> s = Stream.of(1, 2, 3, 4);

s.skip(2).forEach(System.out::print);
s.peek(System.out::print).skip(2).limit(2).count();
List<Integer> list = s.collect(Collectors.toList());

skip 返回一个丢弃原 Stream 的前 N 个元素后剩下元素组成的新 Stream

peek 生成一个包含原 Stream 的所有元素的新 Stream,同时会提供一个 Consumer 实例,新 Stream 每个元素被消费的时候都会执行 Consumer

collect 把 Stream 中的要有元素收集到一个结果容器中

 

2.7 reduce

List<Integer> testList = Lists.newArrayList(1, 2, 3, 4);
testList.stream().reduce(0, (sum, item) -> sum + item); // 10
testList.stream().reduce((sum, item) -> sum + item).orElse(0); // 10

 reduce 的这两个接口,作用都在于通过后面定义的 BinaryOperator 对 Steam 中的元素进行操作,每次操作的接口,作为 BinaryOperator 中的第一个参数,继续下去,直到所有元素遍历完

分享到:
评论

相关推荐

    利用JDK8 stream filter遍历组装树

    List&lt;Menu&gt; children = all.stream().filter(m -&gt; { return Objects.equals(m.getParentId(), root.getId()); }).map((m) -&gt; { m.setChildList(getChildrens(m, all)); return m; } ).collect(Collectors.to...

    JDK8特性(Lambda表达式+StreamAPI简单示例代码)

    JDK8特性(Lambda表达式+StreamAPI的简单使用示例代码)

    jdk8帮助文档(jdk8_API)

    此外,JDK 8还引入了Stream API,它提供了一种声明式的处理数据的方式,特别适合于集合操作。Stream API允许通过链式调用来执行过滤、映射、归约等操作。例如,`List&lt;String&gt; names = list.stream().filter(name -&gt; ...

    jdk 8 免费下载 / jdk8.zip

    JDK 8是Oracle公司发布的Java平台标准版的一个重要版本,首次发布于2014年3月。这个版本引入了许多新特性,极大地提升了开发效率和代码质量。本篇文章将详细介绍JDK 8的关键特性和使用方法。 1. **Lambda表达式**...

    jdk8官方文档

    Java Development Kit (JDK) 8是Java编程语言的一个重要版本,它引入了许多新特性、改进和优化。这个"jdk8官方文档"包含了详细的开发者指南、API参考、教程和其他资源,帮助开发者理解和利用JDK 8的功能。以下是文档...

    jdk8安装包rpm,jdk8安装包rpm

    在这个场景中,我们关注的是JDK 8的RPM安装包,这是一种专为使用Red Hat Package Manager (RPM)的Linux发行版设计的软件包格式。 **一、JDK的组成部分** 1. **Java编译器** (javac):将源代码编译成可执行的字节码...

    jdk8压缩包.zip

    在这个名为"jdk8.zip"的压缩包中,包含了一个重要的文件"jdk8.exe",这通常是Windows操作系统下的JDK安装程序。 1. **模块系统**:JDK 8引入了JSR 294的模块系统(Java Platform Module System,JPMS),它通过模块...

    jdk-8u25、jdk-8u111、jdk-8u131、jdk-8u181、jdk-8u201

    标题和描述中提到的"jdk-8u25、jdk-8u111、jdk-8u131、jdk-8u181、jdk-8u201"代表了不同版本的JDK,这些版本都是针对Java 8的更新版本,"u"后面的数字代表更新(Update)次数。 Java 8是Oracle公司发布的Java平台...

    jdk-8u181最新可商用jdk8 JAVA8 JDK1.8下载

    **Java Development Kit (JDK) 8 是Java编程语言的核心组件,它包含了开发和运行Java应用程序所需的工具和库。此版本是JDK的第181次更新,即JDK 1.8 Update 181(也称为JDK 8u181),它是一个重要的维护版本,提供了...

    jdk8免安装版

    在这个“jdk8免安装版”中,我们拥有的是已经解压并可以直接使用的JDK8版本,无需进行常规的安装过程。 首先,让我们了解一下JDK8的主要特性: 1. **lambda表达式**:这是JDK8最显著的改变之一,它简化了处理函数...

    JDK8安装包.zip

    **Java Development Kit (JDK) 8 安装详解** JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的工具集合。在Java编程领域,JDK8是极其重要的一个版本,它引入了许多新特性,提升了开发...

    java8stream源码-InJDK8:在JDK8

    Jdk8 中 Java8 特性示例,包含 Java 文档和一些单元测试 Java Stream 特性 Stream 不存储元素。 它只是通过计算操作的管道从数据结构、数组或 I/O 通道等来源传送元素。 Stream 本质上是功能性的。 对流执行的操作...

    JDK8 中文帮助文档(jdk api 1.8 google.CHM)

    Stream API是JDK8的一大亮点,它提供了用于操作集合的新方式,支持串行和并行流,可以进行高效的数据处理和聚合操作,如map、filter、reduce等。 **5. Date和Time API重构** JDK8对日期和时间API进行了重大改进,...

    jdk8中文说明文档_CHM.zip jdk1.8文档 jdk1.8说明文档

    Java Development Kit (JDK) 1.8,通常被称为JDK 8,是Java编程语言的一个重要版本,由Oracle公司发布。这个版本引入了许多新特性、优化和改进,旨在提高开发人员的效率和代码的可维护性。 JDK 8中文说明文档提供了...

    jdk8、jkd8中文手册

    在这个压缩包中,包含两个主要文件:`jdk-8u391-windows-x64.exe`是JDK8的Windows 64位安装程序,`jdk api 1.8_google.CHM`则是JDK8的API中文文档。 首先,让我们详细探讨一下JDK8的安装过程。`jdk-8u391-windows-x...

    jdk8-8u191.zip

    JDK 8是Java的一个重要里程碑,引入了许多新特性,例如Lambda表达式、Stream API、新的日期和时间API以及默认方法等,这些都极大地提高了开发效率和代码的简洁性。 "jdk8u191"部分表示这是JDK 8的更新191,这是一个...

    jdk8.zip jdk8.zip

    JDK 8是Oracle公司发布的Java平台标准版的一个重要版本,它引入了许多新特性,对Java社区产生了深远影响。在本篇文章中,我们将深入探讨JDK 8的关键特性和其对开发工作的重要性。 首先,让我们关注JDK 8中的主要新...

    jdk8各平台64位压缩包合集

    Java Development Kit (JDK) 8 是Java编程语言的核心组件,包含了Java运行环境(Java Runtime Environment,JRE)以及开发工具。这个压缩包合集包含了适用于三种主要操作系统的64位版本:Windows、Linux和macOS。...

    JDK8U202.zip

    JDK8U202是Oracle公司发布的一个重要更新版本,尤其值得注意的是,这是JDK 8的最后一个免费提供商业支持的版本。此版本包含了针对Windows和Linux操作系统的64位版本,对于那些依赖Java 8的企业和开发者来说,这是一...

    jdk8安装包(含windows和linux版本).zip

    Stream API也是JDK8的一大亮点,它允许对集合进行高效、声明式的操作,提高了代码的可读性和简洁性。此外,新版本还引入了默认方法,使得接口可以有实现,增强了多线程处理的并发工具,比如ForkJoinPool和Parallel ...

Global site tag (gtag.js) - Google Analytics