服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java关于JDK1.8新特性的Stream流

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

2021-12-16 12:16码农飞哥 Java教程

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

Java 的Stream流

一、定义

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

二、操作的特征

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

三、代码示例

1、生成流

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

?
1
2
3
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 迭代

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

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

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

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

4、map

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

?
1
2
3
4
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方法用于对流进行排序
如下,就是按照元素的大小进行排序

?
1
2
3
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)程序

?
1
2
3
4
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可用于返回列表或字符串

?
1
2
3
4
5
6
7
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);

统计:

?
1
2
3
4
5
6
7
//统计
           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,使用的示例可以参考下方:

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

完整的代码是:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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流的使用一般是要结合函数式接口使用的。

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

原文链接:https://blog.csdn.net/u014534808/article/details/104372832

延伸 · 阅读

精彩推荐
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04