好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

Java 的Stream流

一、定义

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

二、操作的特征

中间的操作都会返回流对象本身,这样多个操作可以串联成一个管道,如同流式风格 内部迭代: 以前对集合的遍历是通过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的运行结果:

总结:

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

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

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

查看更多关于Java关于JDK1.8新特性的Stream流的详细内容...

  阅读:12次