Java关于JDK1.8新特性的Stream流

目录
  • Java 的Stream流
  • 一、定义
    • 二、操作的特征
    • 三、代码示例
      • 1、生成流
      • 2、forEach 迭代
      • 3、limit方法用于获取指定数量的流
      • 4、map
      • 5、sorted
      • 6、并行(parallel)程序
      • 7、Collectors
      • 8、转化(将枚举类转成map)

Java 的Stream流

一、定义

JDK1.8 中增加了Stream流,Stream流是一个来自数据源的元素队列并支持聚合操作。元素是特定类型的对象,形成一个队列,Java中的Stream并不会存储元素,而是按需计算数据源是流的来源,可以使集合,数组,I/O channel,生成器generator等。聚合操作类似SQL语句一样的操作,比如filtermapreducematchsorted

二、操作的特征

  • 中间的操作都会返回流对象本身,这样多个操作可以串联成一个管道,如同流式风格
  • 内部迭代:以前对集合的遍历是通过Iterator或者For-Each的方式,显式的在集合外部进行迭代,这叫做外部迭代,而Stream流式内部迭代。

三、代码示例

1、生成流

如下代码的意思是,首先创建一个集合,然后过滤出所有不为空的元素,重新组成一个集合

 List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd", "");
        List<String> strings = stringList.stream().filter(string -> StringUtils.isNotBlank(string)).collect(Collectors.toList());
  System.out.println("*********过滤后的集合是"+strings);

2、forEach 迭代

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

3、limit方法用于获取指定数量的流

如下就是获取一个长度为10的流。

 Random random = new Random();
        random.ints().limit(10).forEach(System.out::println);

4、map

map方法用于映射每个元素,以下代码片段使用map输出元素对应的平方数

vList<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5, 8, 9);
        //获取对应的平方数
        List<Integer> integers = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
        System.out.println("*********获取对应的平方数"+integers);

5、sorted

sorted方法用于对流进行排序
如下,就是按照元素的大小进行排序

        List<Integer> orgList = Arrays.asList(10, 9, 8, 7, 6, 13, 16, 0, 1, 2);
        List<Integer> sortedList = orgList.stream().sorted().collect(Collectors.toList());
        System.out.println("*********排序后集合是"+sortedList);

6、并行(parallel)程序

 List<String> emptyList = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "");
        //获取空字符串的数量
        long count = emptyList.parallelStream().filter(string -> string.isEmpty()).count();
        System.out.println("*****集合中的空字符串个数=" + count);

7、Collectors

Collectors类实现了很多归约操作,例如将流转换成集合和集合元素,Collectors可用于返回列表或字符串

 List<String> orgCollectors = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
        List<String> filtered = orgCollectors.stream().filter(string -> !string.isEmpty())
                .collect(Collectors.toList());
        System.out.println("筛选列表:" + filtered);

        String mergedString = stringList.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
        System.out.println("合并字符串:" + mergedString);

统计:

 //统计
            List<Integer> orgNums = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
            IntSummaryStatistics statistics = numbers.stream().mapToInt((x) -> x).summaryStatistics();
            System.out.println("列表中最大的数:" + statistics.getMax());
            System.out.println("列表中最小的数:" + statistics.getMin());
            System.out.println("所有数之和:" + statistics.getSum());
            System.out.println("平均数:" + statistics.getAverage());

8、转化(将枚举类转成map)

将一个枚举类转成一个map,使用的示例可以参考下方:

 Map<Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc()));

完整的代码是:

public enum DisableFlagEnum {
    NORMAL(0, "正常"),

    DELETE(1, "已删除");

    private Integer code;

    private String desc;

    DisableFlagEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public Integer getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    public static String getDesc(Integer code) {
        Map<Integer, String> disableFlagMap = Arrays.stream(DisableFlagEnum.values()).collect(Collectors.toMap(p -> p.getCode(), p -> p.getDesc()));
        return disableFlagMap.get(code);
    }
}

demo的运行结果:

总结:

本文首先介绍了JDK1.8中的Stream流,Stream流是是一个来自数据源的元素队列并支持聚合操作。它的特点就是中间过程不会存储数据,不会改变数据源本身。接着介绍了stream的使用示例,stream流的使用一般是要结合函数式接口使用的。

以上就是Java的Stream流的详细内容,更多关于Java的Stream流的资料请关注我们其它相关文章!希望大家以后多多支持我们!

(0)

相关推荐

  • Java深入浅出说流的使用

    目录 一.File类的使用 A.常用构造器 B.路径分隔符 C.常用方法 二.流的分类及其体系 输入.输出的标准化过程 1.输入过程 2.输出过程 三.流的详细介绍 1.字节流和字符流 2.节点流和处理流(重点) 3.其他流 1.标准的输入.输出流 对象流 (重点) 对象流的使用 Person类 对象的序列化机制 随机存取文件流(了解) Java中的NIO 一.File类的使用 1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) 2.File了声明在java.io包下 3.Fi

  • Java I/O流实例之简历替换

    目录 学习内容 内容管理 java文件I/O实例----生成报表 总结 学习内容 Java I/O 项目案例 内容管理 java文件I/O实例----生成报表 我们之前学习了两个重要的模块,一个就是Java I/O 另外一个就是java的界面编程,界面编程我们已经实践过了,但是I/O流还没有实践过呢,所以接下来将做一个小项目就是打印报表 需求描述 假设有一个简历模板文件,比如resume.template, 文件内容如下 我的名字是(name) 我毕业院校是(schoolName) 我的所学专业

  • Java 数据流之Broadcast State

    一.BroadcastState 的介绍 广播状态(Broadcast State)是 Operator State 的一种特殊类型.如果我们需要将配置 .规则等低吞吐事件流广播到下游所有 Task 时,就可以使用 BroadcastState.下游的 Task 接收这些配置.规则并保存为 BroadcastState,所有Task 中的状态保持一致,作用于另一个数据流的计算中. 简单理解:一个低吞吐量流包含一组规则,我们想对来自另一个流的所有元素基于此规则进行评估. 场景:动态更新计算规则.

  • Java基础:流Stream详解

    目录 写在前面 一."流"概念 二.流的分类 1.按流的方向分为:输入流.输出流 2.按流处理数据的单位分为:字节流.字符流 3.按流的功能分为:节点流(又称低级流).过滤流(又称高级流.处理流.包装流) 4.字节流与字符流区别 三.流的方法 1.字节流 字节输入流类:FileInputStream.BufferedInputStream和DataInputStream 构造方法: 常用方法: 构造方法: 常用方法: 构造方法: 常用方法: 字节输出流类:FileOutputStrea

  • Java常用数据流全面大梳理

    目录 缓冲流 转换流 标准输入输出流 打印流 数据流 对象流 随机存取文件流 Java NIO 缓冲流 为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区. 缓冲流要"套接"在相应的节点流之上,根据数据操作单位可以把缓冲流分为: BufferedInputStream 和 BufferedOutputStream BufferedReader 和 BufferedWriter 当读取数据时

  • Java关于JDK1.8新特性的Stream流

    目录 Java 的Stream流 一.定义 二.操作的特征 三.代码示例 1.生成流 2.forEach 迭代 3.limit方法用于获取指定数量的流 4.map 5.sorted 6.并行(parallel)程序 7.Collectors 8.转化(将枚举类转成map) Java 的Stream流 一.定义 JDK1.8 中增加了Stream流,Stream流是一个来自数据源的元素队列并支持聚合操作.元素是特定类型的对象,形成一个队列,Java中的Stream并不会存储元素,而是按需计算数据源

  • java8新特性之stream流中reduce()求和知识总结

    1.stream().reduce()单字段求和 (1)普通数字求和 public static void test2(){ List<Integer> list= Arrays.asList(new Integer[]{1,2,3,4,5,6,7,8,9}); Integer sum=list.stream().reduce((x,y)->x+y).get(); System.out.println(sum); } 2.BigDecimal求和 public static void m

  • JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

    简介 Java Agent是在JDK1.5以后,我们可以使用agent技术构建一个独立于应用程序的代理程序(即为Agent),用来协助监测.运行甚至替换其他JVM上的程序.使用它可以实现虚拟机级别的AOP功能. Agent分为两种,一种是在主程序之前运行的Agent,一种是在主程序之后运行的Agent(前者的升级版,1.6以后提供). JavaAgent的作用Agent给我们程序带来的影响.jpg 使用Agent-premain方法影响的程序效果图.jpg 使用Agent-agentmain方法

  • Java中JDK14的新特性之JFR,JMC和JFR事件流(推荐)

    简介 Java Flight Recorder(JFR)是JVM的诊断和性能分析工具.它可以收集有关JVM以及在其上运行的Java应用程序的数据.JFR是集成到JVM中的,所以JFR对JVM的性能影响非常小,我们可以放心的使用它. 一般来说,在使用默认配置的时候,性能影响要小于1%. JFR的历史很久远了.早在Oracle2008年收购BEA的时候就有了.JFR一般和JMC(Java Mission Control)协同工作. JFR是一个基于事件的低开销的分析引擎,具有高性能的后端,可以以二进

  • java8新特性之stream的collect实战教程

    1.list转换成list 不带return方式 List<Long> ids=wrongTmpList.stream().map(c->c.getId()).collect(Collectors.toList()); 带return方式 // spu集合转化成spubo集合//java8的新特性 List<SpuBo> spuBos=spuList.stream().map(spu -> { SpuBo spuBo = new SpuBo(); BeanUtils.c

  • JDK1.8新特性之方法引用 ::和Optional详解

    一:简介 方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式 静态方法引用,通过类名::静态方法名, 如 Integer::parseInt 实例方法引用,通过实例对象::实例方法,如 str::substring 构造方法引用,通过类名::new, 如 User::new 二:方法引用 public final class Integer { public static int parseInt(String s) throws NumberForm

  • 深入理解Java8新特性之Stream API的创建方式和中间操作步骤

    目录 1.什么是StreamAPI? 2.Stream API操作的三个步骤 2.1 创建Stream 2.2 中间操作 2.2.1 中间操作之筛选与切片 2.2.2 中间操作之映射 2.2.3 中间操作之排序 1.什么是StreamAPI? Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 m Stream API (java.util.stream.*) . Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复

  • java9新特性Reactive Stream响应式编程 API

    目录 一.Java9ReactiveStreamAPI 二.Java响应式编程四大接口 2.1.SubscriberInterface(订阅者订阅接口) 2.2.SubscriptionInterface(订阅令牌接口) 2.3.PublisherInterface(发布者接口) 2.4.ProcessorInterface(处理器接口) 二.实战案例 实现订阅者SubscriberInterface SubmissionPublisher消息发布者 我计划在后续的一段时间内,写一系列关于jav

  • java9新特性Reactive Stream响应式编程 API

    目录 一.Java9ReactiveStreamAPI 二.Java响应式编程四大接口 2.1.SubscriberInterface(订阅者订阅接口) 2.2.SubscriptionInterface(订阅令牌接口) 2.3.PublisherInterface(发布者接口) 2.4.ProcessorInterface(处理器接口) 二.实战案例 实现订阅者SubscriberInterface SubmissionPublisher消息发布者 我计划在后续的一段时间内,写一系列关于jav

  • 深入理解Java8新特性之Stream API的终止操作步骤

    目录 1.写在前面 2.终止操作 2.1 终止操作之查找与匹配 2.2 终止操作之归约与收集 1.写在前面 承接了上一篇文章(说完了Stream API的创建方式及中间操作):深入理解Java8新特性之Stream API的创建方式和中间操作步骤. 我们都知道Stream API完成的操作是需要三步的:创建Stream → 中间操作 → 终止操作.那么这篇文章就来说一下终止操作. 2.终止操作 终端操作会从流的流水线生成结果.其结果可以是任何不是流的值,例如:List.Integer,甚至是 v

随机推荐