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