java8 stream

时间:2022-05-06
本文章向大家介绍java8 stream,主要内容包括定义Stream、使用Stream、map方法的使用、flatMap的使用和map一样、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

转载:猿天地 链接:http://cxytiandi.com/blog/detail/2220

Stream 作为 Java 8 的一大亮点,我个人是非常喜欢用的,用起来爽多了。

定义Stream

可以通过of来定义stream,也可以通过集合来转成stream。

Stream<String> stream = 
    Stream.of("java", "css", "php");
stream = Arrays.asList(
    "张三", "张三丰", "张大佛爷", "张").stream();

也可以使用generate产生无限数量的stream,当然可以用limit方法限制

下面的语句将产生无数的随机数字,将一直循环下去

Stream<Double> dsStream = 
    Stream.generate(Math::random);
dsStream.forEach(System.out::println);

使用Stream

filter方法的使用,filter顾名思义,过滤的作用,怎么过滤呢?

比如说我们有个姓名的集合,想要统计出集合里名字的字数大于1的数量有多少?

首先是不使用stream的传统方法

List<String> contents = 
         Arrays.asList("张三", "张三丰", "张大佛爷", "张");
int count = 0;
for (String con : contents) {
  if(con.length() > 1) {
      count++;
  }
}
System.out.println(count);

下面是使用stream之后的代码,一行就搞定了,在filter方法里用lambda表达式进行过滤,然后用count方法统计出符合条件的数量。

long new_count = contents.stream()
      .filter(con -> con.length() > 1).count();
System.out.println(new_count);

当然如果你的数据量比较多,而你希望统计的速度更快时,可以使用并行处理的stream来操作。

new_count = contents.parallelStream()
     .filter(con -> con.length() > 1).count();

map方法的使用

map其实就是将stream中的数据映射成 output Stream 的另外一个元素。全部循环的过一遍。

使用map可以将stream中的值都转成大小写,如果用List的话还得循环变量然后取toUpperCase()

Stream<String> stream = 
    Stream.of("java", "css", "php");
stream.map(String::toUpperCase)
    .forEach(System.out::println);

flatMap的使用和map一样

不同的点在于flatMap是将多个stream中的多个数据集合连接起来成为一个最终的stream。

Stream<List<Integer>> number_stream =
Stream.of(
   Arrays.asList(10),
   Arrays.asList(22, 33),
   Arrays.asList(44, 55, 66)
);
number_stream.flatMap((c) -> c.stream())
   .forEach(System.out::println);

最终的结果就变成了Stream 输出结果就是10,22,33,44,55,66