JavaSE:Java8新特性 - Stream接口

1.  案例题目

      准备一个List集合,并放入Person类型的对象,将集合中所有成年人过滤出来,放到另外一个集合,并打印出来。

 未使用Stream接口时:

 13 public class ListPersonTest {
 14 
 15     public static void main(String[] args) {
 16 
 17         // 1.准备一个List集合并放入Person类型的对象后打印
 18         List<Person> list = new LinkedList<>();
 19         list.add(new Person("zhangfei", 30));
 20         list.add(new Person("xiaoqiao", 17));
 21         list.add(new Person("zhouyu", 20));
 22         list.add(new Person("zhangfei", 30));
 23         list.add(new Person("guanyu", 35));
 24         list.add(new Person("liubei", 40));
 25         for (Person tp: list) {
 26             System.out.println(tp);
 27         }
 28 
 29         System.out.println("-------------------------------------------------------");
 30         // 2.将List集合中所有成年人过滤出来并放入另外一个集合中打印
 31         List<Person> list1 = new LinkedList<>();
 32         for (Person tp : list) {
 33             if (tp.getAge() >= 18) {
 34                 list1.add(tp);
 35             }
 36         }
 37         for (Person tp : list1) {
 38             System.out.println(tp);
 39         }
    }
  }

 

2.  基本概念

      <1>java.util.stream.Stream接口,是对集合功能的增强,可以对集合元素进行复杂的查找、过滤、筛选等操作

      <2>Stream接口,借助于Lambda表达式,极大地提高编程效率和程序可读性,同时它提供串行和并行两种模式进行汇聚操作,

        并发模式能够充分利用多核处理器的优势。

 

3.  使用步骤

      <1>创建Stream,通过一个数据源来获取一个流

      <2>转换Stream, 每次转换返回一个新的Stream对象

      <3>对Stream进行聚合操作并产生结果

 

4.  创建方式

      <1>  方式一:通过调用集合的默认方法来获取流,如: default Stream stream()

      <2>  方式二:通过数组工具类中的静态方法来获取流,如: static IntStream stream (int[] array)

      <3>  方式三:通过Stream接口的静态方法来获取流,如:static Stream of (T... values)  

      <4>  方式四:通过Strean接口的静态方法来获取流,如: static Stream generate (Supplier <? extends T> s)

 

5.  中间操作

     筛选与切片的常用方法如下:

方法声明 功能介绍
Stream filter(Predicate <? super T> predicate) 返回一个包含匹配元素的流
Stream distinct() 返回不包含重复元素的流
Stream limit(long maxSize) 返回不超过给定元素数量的流
Stream skip(long n) 返回丢弃前n个元素后的流

   映射的常用方法如下:

方法声明 功能介绍
Stream map(Function<? super T, ? extends R> mapper) 返回每个处理过元素组成的流
Stream flatMap (Function<? super T, ? extends Stream<? extends R>> mapper) 返回每个被替换过元素组成的流,并将所有流合成一个流

 

      排序的常用方法如下:

方法声明 功能介绍
Stream sorted() 返回经过自然排序后元素组成的流
Stream sorted(Comparator <? super T> comparator) 返回经过比较器排序后元素组成的流

 

 

6.  终止操作

      匹配与查找的方法如下:

Optional findFirst() 返回该流的第一个元素
boolean allMatch(Predicate<? super T> predicate) 返回所有元素是否匹配
boolean noneMatch (Predicate <? super T> predicate) 返回没有元素是否匹配
Optional max (Comparator <? super T> comparator) 根据比较器返回最大元素
Otional min (Comparator <? super T> compatator) 根据比较器返回最小元素
long count() 返回元素的个数
void forEach(Consumer <? super T> action) 对流中每个元素执行操作

      规约的常用方法如下:

Optional reduce(BinaryOperator accumulator) 返回结合后的元素值

      收集的常用方法如下:

<R,A>R collect (Collector <? super T,A,R> collector) 使用收集器,对元素进行处理

 

7.  使用Stream接口,实现案例题目(1.)的功能

  1 package com.lagou.task22;
  2 
  3 import java.util.Comparator;
  4 import java.util.LinkedList;
  5 import java.util.List;
  6 import java.util.Optional;
  7 import java.util.function.BinaryOperator;
  8 import java.util.function.Consumer;
  9 import java.util.function.Function;
 10 import java.util.function.Predicate;
 11 import java.util.stream.Collectors;
 12 
 13 public class ListPersonTest {
 14 
 15     public static void main(String[] args) {
 16 
 17         // 1.准备一个List集合并放入Person类型的对象后打印
 18         List<Person> list = new LinkedList<>();
 19         list.add(new Person("zhangfei", 30));
 20         list.add(new Person("xiaoqiao", 17));
 21         list.add(new Person("zhouyu", 20));
 22         list.add(new Person("zhangfei", 30));
 23         list.add(new Person("guanyu", 35));
 24         list.add(new Person("liubei", 40));
 25         for (Person tp: list) {
 26             System.out.println(tp);
 27         }
 28 
 29         System.out.println("-------------------------------------------------------");
 30         // 2.将List集合中所有成年人过滤出来并放入另外一个集合中打印
 31         List<Person> list1 = new LinkedList<>();
 32         for (Person tp : list) {
 33             if (tp.getAge() >= 18) {
 34                 list1.add(tp);
 35             }
 36         }
 37         for (Person tp : list1) {
 38             System.out.println(tp);
 39         }
 40 
 41         System.out.println("-------------------------------------------------------");
 42         // 3.使用Stream接口实现上述功能
 43         list.stream().filter(new Predicate<Person>() {
 44             @Override
 45             public boolean test(Person person) {
 46                 return person.getAge() >= 18;
 47             }
 48         }).forEach(new Consumer<Person>() {
 49             @Override
 50             public void accept(Person person) {
 51                 System.out.println(person);
 52             }
 53         });
 54 
 55         System.out.println("-------------------------------------------------------");
 56         // 4.使用lambda表达式对上述代码进行优化
 57         //list.stream().filter(person -> person.getAge() >= 18).forEach(person -> System.out.println(person));
 58         list.stream().filter(person -> person.getAge() >= 18).forEach(System.out::println);
 59 
 60         System.out.println("-------------------------------------------------------");
 61         // 5.实现对集合中元素通过流跳过2个元素后再取3个元素后打印
 62         list.stream().skip(2).limit(3).forEach(System.out::println);
 63 
 64         System.out.println("-------------------------------------------------------");
 65         // 6.实现集合中所有元素中的年龄获取出来并打印
 66         list.stream().map(new Function<Person, Integer>() {
 67             @Override
 68             public Integer apply(Person person) {
 69                 return person.getAge();
 70             }
 71         }).forEach(System.out::println);
 72 
 73         //list.stream().map(person -> person.getAge()).forEach(System.out::println);
 74         list.stream().map(Person::getAge).forEach(System.out::println);
 75 
 76         System.out.println("-------------------------------------------------------");
 77         // 7.实现集合中所有元素的自然排序并打印
 78         list.stream().sorted().forEach(System.out::println);
 79 
 80         System.out.println("-------------------------------------------------------");
 81         // 8.判断集合中是否没有元素的年龄是大于45岁的
 82         boolean b1 = list.stream().noneMatch(new Predicate<Person>() {
 83             @Override
 84             public boolean test(Person person) {
 85                 return person.getAge() > 45;
 86             }
 87         });
 88         System.out.println("b1 = " + b1); // true
 89 
 90         b1 = list1.stream().noneMatch(person -> person.getAge() > 45);
 91         System.out.println("b1 = " + b1); // true
 92 
 93         System.out.println("-------------------------------------------------------");
 94         // 9.按照指定的比较器规则获取集合所有元素中的最大值
 95         Optional<Person> max = list.stream().max(new Comparator<Person>() {
 96             @Override
 97             public int compare(Person o1, Person o2) {
 98                 return o1.getAge() - o2.getAge();
 99             }
100         });
101         System.out.println("按照年龄排序后的最大值是:" + max);
102 
103         max = list.stream().max((o1, o2) -> o1.getAge() - o2.getAge());
104         System.out.println("按照年龄排序后的最大值是:" + max);
105 
106         System.out.println("-------------------------------------------------------");
107         // 10.实现将集合中所有元素的年龄映射出来并进行累加后打印
108         Optional<Integer> reduce = list.stream().map(Person::getAge).reduce(new BinaryOperator<Integer>() {
109             @Override
110             public Integer apply(Integer integer, Integer integer2) {
111                 return integer + integer2;
112             }
113         });
114         System.out.println("最终所有年龄的累加和是:" + reduce); // 172
115 
116         //reduce = list.stream().map(Person::getAge).reduce(((integer, integer2) -> integer + integer2));
117         reduce = list.stream().map(Person::getAge).reduce((Integer::sum));
118         System.out.println("最终所有年龄的累加和是:" + reduce); // 172
119 
120         System.out.println("-------------------------------------------------------");
121         // 11.实现将集合中所有元素的姓名映射出来并收集到集合中打印
122         list.stream().map(Person::getName).collect(Collectors.toList()).forEach(System.out::println);
123     }
124 }

 

posted @ 2021-06-29 14:20  Jasper2003  阅读(71)  评论(0编辑  收藏  举报