Java 8一学习Stream API

一、什么是Stream

1、stream并不是某种数据结构,它只是数据源的一种视图。这里的数据源可以是一个数组,集合等。stream接口继承关系如下: 
这里写图片描述 
其中IntStream LongStream DoubleStream对应数据基本类型int long double三种数据类型。

2、Stream的特性:

  • 不存储数据:流是基于数据源的对象,不会存储数据元素,而是通过管道将数据源的元素传递给操作。
  • 函数式编程stream不会修改数据源,当我们执行stream过滤掉一些数据时,并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream
  • 懒加载(延迟操作):stream上的操作并不会立马执行,而是要等到执行结束操作(terminal operation),中间操作(intermediate operation)才会被一次执行。 
    这里写图片描述

  • 可消费性stream只能被消费一次,一旦遍历过就会失效,想要再次遍历就只能再次生成stream

二、Stream的创建

Stream的创建,主要是从数据源Data Source分类:

1、从CollectionArray数组:

  • Collection.stream()
  • Collection.parallelStream()
  • Arrays.stream(T array) or Stream.of()

2、从 BufferedReader

  • java.io.BufferedReader.lines()

3、静态工厂:

  • java.util.stream.IntStream.range()
  • java.nio.file.Files.walk()

4、自己构建:

  • java.util.Spliterator

5、其它

  • Random.ints()
  • BitSet.stream()
  • Pattern.splitAsStream(java.lang.CharSequence)
  • JarFile.stream()

我常用的是从数组ArraysCollection创建Stream

// 1. Individual values
Stream stream = Stream.of("a", "b", "c");
IntStream.of(new int[]{1, 2, 3}).forEach(System.out::println);//LongStream、DoubleStream同理
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注:由于可消费性,以上stream只能被使用一次,只是为了方便所以同名stream,否则会出现如下错误: 
这里写图片描述

三、Stream的常用中间操作与终止操作


中间操作方法介绍结束操作方法介绍
concat()流连接操作anyMatch()最少有一个满足条件返回true,否则返回false
distinct()返回一个去除重复元素之后的Streamcollect()Stream类型转集合/数组类型
filter()返回一个符合predicate条件元素的StreamallMatch()有一个匹配就返回true
limit()返回前n个元素数据组成的Streamcount()返回Stream中元素的个数
map()映射操作,返回由新元素组成的Stream(每个元素按照某种操作进行转换)findAny()用于获取含有Stream中的某个元素的Optional
peek()主要用来查看流中元素的数据状态findFirst()用于获取含有Stream中的第一个元素的Optional
skip()跳过前N个元素后,剩下的元素重新组成一个StreamforEach()对容器中的每个元素执行action指定的动作,也就是对元素进行遍历,见例子
storted()返回一个排序的StreamforEachOrdered()类似于forEach()方法,如果该Stream预先设定了顺序,会按照预先设定的顺序执行(Stream是无序的),默认为元素插入的顺序。
parallel()调用stream()或sequential()就成为了串行流,调用parallelStream()或parallel()就成为了并行流max()求最大值
sequential()与parallel()相反min()求最小值
faltMap()将最底层元素抽出来放到一起,简单的说:就是一个或多个Stream合并成一个新Streamreduce()规约操作,是通过某个连接动作将所有元素汇总成一个汇总结果的过程。元素求和、求最大值或最小值、求出元素总个数、将所有元素转换成一个列表或集合,都属于规约操作,是Stream很重要的一个操作
noneMatch()全部都不匹配才返回true
toArray()使用流的元素创建一个数组。

举例

例1: 使用forEach()迭代

Stream<String> stream = Stream.of("a", "b", "c");
stream.forEach(str -> System.out.println(str));
  • 1
  • 2

例2:使用filter()过滤

//过滤出字符串长度为3的字符串并输出
Stream<String> stream= Stream.of("aa", "bb", "ccc", "dd");
stream.filter(str -> str.length()==3)
    .forEach(str -> System.out.println(str));
  • 1
  • 2
  • 3
  • 4

例3:使用map()映射转换:有mapToInt,mapToLong和mapToDouble三个方法,mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗;

//将a,b,c,d转为大写A,B,C,D并输出
Stream<String> stream = Stream.of("a", "b", "c", "d");
stream.map(str -> str.toUpperCase())
    .forEach(str -> System.out.println(str));
  • 1
  • 2
  • 3
  • 4

例4:使用flatMap()合并:合并后的数据类型可能会发生改变

//合并三个Stream流输出1,2,3,4,5
Stream<List<Integer>> stream = Stream.of(Arrays.asList(1,2), Arrays.asList(3, 4, 5));
stream.flatMap(list -> list.stream())
    .forEach(i -> System.out.println(i));
  • 1
  • 2
  • 3
  • 4

例5:使用peek():生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数,新Stream每个元素被消费的时候都会执行给定的消费函数,并且消费函数优先执行

List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
 list.strem().peek(str-> System.out.println("accept:" + str))
        .forEach(System.out::println);
  • 1
  • 2
  • 3
  • 4
  • 5

例6:使用skip():过滤掉原Stream中的前N个元素,返回剩下的元素所组成的新Stream。如果原Stream的元素个数大于N,将返回原Stream的后(原Stream长度-N)个元素所组成的新Stream;如果原Stream的元素个数小于或等于N,将返回一个空Stream

//输出4,5:跳过1,2,3
Stream.of(1,2,3,4,5).skip(3).forEach(System.out::println); 
  • 1
  • 2

例7:使用allMatch方法:如果全部满足条件返回true,否则返回false。

//全部大于0,返回true
boolean allMatch = Stream.of(1, 2, 3, 4).allMatch(integer -> integer > 0);
System.out.println("allMatch: " + allMatch); 
  • 1
  • 2
  • 3

例8:使用collect方法将Stream变为List、Set、Map等集合。

Stream<String> stream = Stream.of("Hello", "World", "Lijian");
List<String> list = stream.collect(Collectors.toList()); // (1)生成list集合
//Set<String> set = stream.collect(Collectors.toSet()); // (2)生成set集合
//Map<String, Integer> map = stream.collect(Collectors.toMap(Function.identity(), String::length)); // (3)生成map,其中identity()是函数式接口的静态方法

文章转自:https://blog.csdn.net/mynewclass/article/details/80393308 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值