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

这篇文章主要介绍了版本薇JDK1.8 的Java中的Stream流,Stream流是一个来自数据源的元素队列并支持聚合操作,感兴趣的朋友可以参考下面文章内容

Java 的Stream流

一、定义

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

二、操作的特征

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

三、代码示例

1、生成流

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

 List stringList = Arrays.asList("abc", "", "bc", "efg", "abcd", ""); List 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 numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5, 8, 9); //获取对应的平方数 List integers = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList()); System.out.println("*********获取对应的平方数"+integers); 

5、sorted

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

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

6、并行(parallel)程序

 List 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 orgCollectors = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl"); List 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 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 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 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关于JDK1.8新特性的Stream流的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java