①Stream 自己不会存储元素。 ②Stream 不会改变源对象。每次处理都会返回一个持有结果的新Stream。 ③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。说明:可以把Stream想象成一条流(流水线)在流的上面有很多操作(过滤,转换,排序,.....)
创建StreamAPI
例1:
static List<Integer> list = new ArrayList<>();static {list.add(10);list.add(20);list.add(15);list.add(19);list.add(59);}@Testpublic void test(){Stream<Integer> stream = list.stream();//lambda表达式stream.forEach(i -> System.out.println(i));//方法的引用stream.forEach(System.out::println);list.stream().forEach(System.out::println);}
中间操作API
例2:
/*通过数组创建Stream:public static <T> Stream<T> stream(T[] array): 返回一个流*/@Testpublic void test3(){int[] numbers = {12,89,23,65,32};Arrays.stream(numbers).forEach(System.out::println);}
例3:
@Testpublic void test(){Stream<Person> stream = list.stream();//Stream filter(Predicate p)接收 Lambda , 从流中排除某些元素Stream<Person> stream2 = stream.filter(new Predicate<Person>() {@Overridepublic boolean test(Person person) {//只要分数及格的return person.score >= 60;}});stream2.forEach(System.out::println);list.stream().filter(p -> p.score >= 60).forEach(System.out::println);}
例3:
@Teststatic List<Person> list = new ArrayList<>();public void test3(){list.stream().distinct()//Person重写equals和hashCode方法后是按照内容去重.limit(2) //获取前2个元素.forEach(System.out::println);}
例4:Comparator
@Testpublic void test6(){list.stream()//.sorted()//自然排序.sorted(new Comparator<Person>() {//定制排序@Overridepublic int compare(Person o1, Person o2) {return o1.score - o2.score;}}).forEach(System.out::println);list.stream().sorted((o1,o2) -> o1.score - o2.score).forEach(System.out::println);}
终结操作API
终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是 void。流进行了终止操作后,不能再次使用。
1 | boolean | allMatch(Predicate p) | 检查是否匹配所有元素 |
2 | boolean | anyMatch(Predicate p) | 检查是否至少匹配一个元素 |
3 | boolean | noneMatch(Predicate p) | 检查是否没有匹配所有元素 |
4 | Optional<T> | findFirst() | 返回第一个元素 |
5 | Optional<T> | findAny() | 返回当前流中的任意元素 |
6 | long | count() | 返回流中元素总数 |
7 | Optional<T> | max(Comparator c) | 返回流中最大值 |
8 | Optional<T> | min(Comparator c) | 返回流中最小值 |
9 | void | forEach(Consumer c) | 迭代 |
10 | T | reduce(T iden, BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 T |
11 | U | reduce(BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 Optional<T> |
12 | R | collect(Collector c) | 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法 |