概述
Stream流完全不是I/O流,按照流水线处理方式来考虑代码中的思想。
JDK1.8 之后,我们拥有了Lambda表达式,让代码的中心偏向解决实际问题,直到重点,可以提高效率。
Stream流中使用了大量Lambda表达式,利用Lambda操作方式,提供开发效率
在我们进行数据处理时有很大的帮助
获取Stream流的三种方式
数组
int[] arr = {1, 2, 3, 4, 5};
Arrays.stream(arr);
Collection集合
List<Integer> list = new ArrayList<Integer>();
list.stream();
int[] arr = {1, 2, 3, 4, 5};
Stream.of(arr);
stream常用方法
stream方法分为两种方法,一种是中间方法,一种是终结方法
- 中间方法返回值是
stream
类型,可以进行流式操作。 - 终结方法返回值不是
stream
类型,不可以进行流式操作。
stream
中间方法
Stream<T> filter(Predicate<? super T> predicate)
这个方法是一个过滤方法,传入一个函数式接口predicate
判定元素是否符合规定,然后进行剔除
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Stream<Integer> stream = list.stream();
stream.filter(integer -> integer >= 2).forEach(System.out::println);
Stream<T> distinct()
这个方法用来去除流中重复的元素,这个方法需要重写比较对象的equals
方法
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(5);
Stream<Integer> stream = list.stream();
stream.distinct().forEach(System.out::println);
<R> Stream<R> map(Function<? super T,? extends R> mapper)
这个方法用来处理流中每一个元素,用function
函数式接口指明需要进行的操作
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(5);
Stream<Integer> stream = list.stream();
stream.map(s -> String.valueOf(s) + "我").forEach(System.out::println);
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
这是一个静态方法,将两个流中的数据合并,生成一个新的流
```java
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(5);
List<Integer> list2 = new ArrayList<Integer>();
list2.add(1);
list2.add(2);
list2.add(2);
Stream.concat(list.stream(), list2.stream()).forEach(System.out::println);
Stream<T> sorted() 和 Stream<T> sorted(Comparator<? super T> comparator)
sorted()
是将流内数据按照自然排序的方式进行排序。sorted(Comparator<? super T> comparator)
传入一个自定义的比较器,进行数据排序
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(5);
list.stream().sorted().forEach(System.out::println);
list.stream().sorted(Comparator.comparingInt(Integer::intValue)).forEach(System.out::println);
stream
终结方法
<R,A> R collect(Collector<? super T,A,R> collector)
这个方法将已经是流的对象,重新转换成Colletion
集合
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(5);
List<Integer> collect = list.stream().filter(integer -> integer > 2).collect(Collectors.toList());
long count()
这个方法返回这个流中存在元素的个数
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(5);
long count = list.stream().count();
System.out.println(count);