一、概述

Stream流:可以按照特定的规则对数据进行操作。
【注意】:Stream流本身不会储存数据。

二、Stream流的使用

生成流→中间操作→终结操作

1.生成流:

    通过数据源(数组、列表等)生成流,如:list.stream()。
    常见的生成方式:
(1)Collection体系的集合可以使用默认方法stream()生成流。
List<String> l=new ArrayList<String>();
Stream<String> listStream = l.stream(); 
Set<String> set=new HashSet<>();
Stream<String> setStream = set.stream();
(2)Map体系的集合可以通过分别获得键、值、键值对的Set集合间接的生成流。
Map<String,Integer> m=new HashMap<>();
Stream<String> keyStream = m.keySet().stream();
Stream<Integer> valueStream = m.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = m.entrySet().stream();
(3)数组可以通过Stream接口的静态方法of(T... values)生成流。
String[] strArr={"hello","world","java"};
Stream<String> strArrStream = Stream.of(strArr);
Stream<String> stream = Stream.of("hello", "world", "java");

2.中间操作

        一个流可以跟多个中间操作,其目的是打开流,做出某种程度的数据过滤或映射,然后返回一个新的流,交给下一个操作使用,如:filter()。
Stream<T> filter(Predicate<? super T> predicate)
返回此流中符合条件由Predicate给出)的元素组成的流。
Stream<T> limit(long maxSize)
返回此流中前maxSize个元素组成的流。
Stream<T> skip(long n)
返回跳过前n个元素后剩下的元素组成的流。
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
返回由流a和流b元素合并的流。注意这是个静态方法,直接用Stream接口调用该方法。
Stream<T> distinct()
返回此流中不重复元素组成的流。
Stream<T> sorted()
返回此流根据自然顺序排序的元素组成的流。
Stream<T> sorted(Comparator<? super T> comparator)
返回此流根据Comparator比较器排序的元素组成的流。
<R> Stream<R> map(Function<? super T,? extends R> mapper)
返回由给定函数应用于此流的元素的结果组成的流。
IntStream mapToInt(ToIntFunction<? super T> mapper)
返回一个 IntStream其中包含将给定函数应用于此流的元素的结果。
【tips】:IntStream是原始int流,它要求元素都是int类型。

3.终结操作

        一个流只能有一个终结操作,当终结操作被执行后,流就无法再被操作,forEach()。
void forEach(Consumer<? super T> action)
对此流的每个元素执行指定的操作。
long count()
返回此流中的元素个数

三、Stream流的收集操作

1.收集方法

<R,A> R collect(Collector<? super T,A,R> collector)
将此流的元素收集到一个新的集合。
【tips】:收集方法collect()的形参Collector是一个接口,这里可使用它的工具类Collectors,因为Collectors中方法的返回值类型都是Collector。

2.Collectors工具类的常用方法

static <T> Collector<T,?,List<T>> toList()
返回一个 Collector ,将输入的元素收集到一个新的 List 。
static <T> Collector<T,?,Set<T>> toSet()
返回一个 Collector ,将输入的元素收集到一个新的 Set。
static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> key, Function<? super T,? extends U> value)
返回一个 Collector ,将元素通过函数收集到一个新的  Map。