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

作者:码农飞哥 时间:2021-06-02 11:36:35 

目录
  • 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的运行结果:

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

总结:

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

来源:https://blog.csdn.net/u014534808/article/details/104372832

标签:Java,Stream
0
投稿

猜你喜欢

  • SpringBoot整合WebService的实现示例

    2023-05-25 12:37:55
  • 浅析Disruptor高性能线程消息传递并发框架

    2023-02-26 14:09:01
  • SpringCloud Feign配置应用详细介绍

    2023-07-14 04:23:03
  • C# WinForm制作异形窗体与控件的方法

    2023-11-07 11:09:28
  • Java实现Redis的集合(set)命令操作

    2022-05-08 11:07:03
  • 在Spring使用iBatis及配置讲解

    2021-07-06 20:07:39
  • 解决BeanUtils.copyProperties无法成功封装的问题

    2023-11-23 14:59:23
  • 详解springboot读取yml配置的几种方式

    2023-08-21 02:44:54
  • 详解ThreadLocal为什么会内存溢出原理

    2023-11-09 18:45:26
  • Java try()语句实现try-with-resources异常管理机制操作

    2022-02-06 18:29:16
  • Kafka Producer中的消息缓存模型图解详解

    2022-05-03 06:00:13
  • JavaWeb开发之使用jQuery与Ajax实现动态联级菜单效果

    2023-11-28 19:46:08
  • springboot整合EHCache的实践方案

    2023-08-23 23:48:31
  • Spring Cloud Eureka 注册与发现操作步骤详解

    2022-06-25 07:11:12
  • 一文详解Reactor模型与实现示例

    2023-11-13 12:22:09
  • java连接SQL Server数据库的方法

    2022-10-14 04:16:56
  • 使用JDBC实现数据访问对象层(DAO)代码示例

    2021-11-12 23:33:46
  • Java基础之Web服务器与Http详解

    2021-08-13 16:39:42
  • 第三方包jintellitype实现Java设置全局热键

    2023-09-25 10:33:50
  • 使用Logback日志保存到相对路径的操作

    2021-10-11 16:42:30
  • asp之家 软件编程 m.aspxhome.com