Java8新特性---Stream流式编程

  java8中,除了Lambda表达式之外,还提供了强大的Stream API(java.util.stream.*),即流式编程。那什么是流式编程?

什么是流式编程

  Stream是Java8中处理集合的关键抽象概念,它可以指定你想对集合进行的操作,比如:进行非复杂的查询、过滤、或者映射数据等一系列的操作。Stream不是集合元素,也不是数据结构,它相当于一个高级版本的遍历器(Iterator),不能够重复遍历里面的数据,就像是流水一样,流过就不再复返了。与普通的Iterator不同的是,普通的Iterator只能是串行,而Stream可以并行操作,这样就大大提高了我们的操作速度。
Java8新特性---Stream流式编程_第1张图片

注意:

1)Stream自己不会存储元素

2)Stream的相关操作不会改变数据源。相反地他们会返回一个含有操作结果的新的Stream

Stream操作三步曲

1)创建 Stream

一个数据源(如:集合、数组),获取一个Stream流

方法 描述
stream() 获取串行流
parallelStream() 获取并行流

2)中间操作

在流的传输过程中,对Stream流进行处理

查询

方法 描述
allMatch(Predicate p) 检查是否匹配所有元素
anyMatch(Predicate p) 检查是否至少匹配一个元素
noneMatch(Predicate p) 检查是否没有匹配所有元素
findFirst() 返回第一个元素
findAny() 返回当前流中的任意元素

筛选与切片

方法 描述
distinct() 筛选,通过流所生成的元素的hashCode()和equals()去除重复的元素(要去重的实体类需要重写hashCode和equals方法)
limit(long maxSize) 截断流,使其元素不超过给定数量
filter(Predicate p) 接收Lambda,从流中排除掉某些元素
skip(long n) 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补

映射

方法 描述
map(Function f) 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
mapToInt(ToIntFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream
mapToLong(ToLongFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream
mapToDouble(ToDoubleFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream
flatMap(Function f) 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连成一个流

排序

方法 描述
sorted() 产生一个新流,其中按自然顺序排序
sorted(Comparator comp) 产生一个新流,其中按比较器顺序排序

comparable:自然排序

3)终止操作(终端操作)

终止操作返回的是一个结果,就是所有中间操作做完之后进行的操作,比如汇总、遍历输出、求和等等

Stream操作案例

  这里只是有选择性的做了几个案例,其实只要知道上面的“三步曲”,然后再知道点Lambda表达式,就能够进行Stream流式编程了。

1)筛选与切片

List<Book> books = Arrays.asList(
      new Book("三国演义", 20, "罗贯中"),
      new Book("西游记", 25, "吴承恩"),
      new Book("水浒传", 30, "施耐庵"),
      new Book("红楼梦", 35, "曹雪芹")
  );


  /**
   * 筛选出price大于等于30的书籍
   */
  @Test
  void test1() {
    //获取流
    Stream<Book> bookStream = books.stream()
        //中间操作
        .filter((book -> book.getPrice() >= 30));
    //终止操作,遍历输出
    bookStream.forEach(System.out::println);
  }
/** 结果:
 * Book{name='水浒传', price=30, author='施耐庵'}
 * Book{name='红楼梦', price=35, author='曹雪芹'}
 */

2)排序

 /**
   * 排序
   * List books = Arrays.asList(
   *       new Book("水浒传", 30, "施耐庵"),
   *       new Book("西游记", 25, "吴承恩"),
   *       new Book("三国演义", 20, "罗贯中"),
   *       new Book("红楼梦", 35, "曹雪芹")
   *   );
   */
  @Test
  void test7() {
    books.stream().sorted((b1, b2) -> {
      if (b1.getPrice().equals(b2.getPrice())) {
        return b1.getName().compareTo(b2.getName());
      } else {
        return b1.getPrice().compareTo(b2.getPrice());
      }
    }).forEach(System.out::println);
  }

/**
   * Book{name='三国演义', price=20, author='罗贯中'}
   * Book{name='西游记', price=25, author='吴承恩'}
   * Book{name='水浒传', price=30, author='施耐庵'}
   * Book{name='红楼梦', price=35, author='曹雪芹'}
   */

3)匹配

  /**
   * 匹配
   *  allMatch() :是否全部匹配,返回boolean
   *  anyMatch() :任意一个是否匹配,返回boolean
   */
  @Test
  void test8() {
    System.out.println(books.stream().allMatch(book -> {
      if (book.getPrice().equals(25)) {
        return true;
      }
      return false;
    }));
  }

4)map映射

  /**
   * map 映射 获取 所有book对象中最高的price
   */
  @Test
  void test9() {
    Optional<Integer> max = books.stream()
        .map(Book::getPrice)
        .max(Integer::compareTo);
    System.out.println("books中price最高为:" + max.get());
  }

  /**
   *books中price最高为:30
   */

你可能感兴趣的:(Java8新特性)