码迷,mamicode.com
首页 > 其他好文 > 详细

Stream

时间:2021-01-18 11:42:13      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:去除   distinct   stream   next   strong   计算   ext   数据   tin   

流(Stream)

Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。

“集合讲的是数据,流讲的是计算”!

 

注意:

1)Stream 不会自己存储元素

2)Stream 不会改变源对象。相反,Stream会返回一个持有结果的新Stream

3)Stream 操作是延迟执行的。这意味Stream会等到需要结果的时候才执行

 

一、Stream的三个操作步骤

1. 创建Stream

2. 中间操作

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

 

二、创建Stream

1. 通过Collection 系列集合提供的stream() 或 parallelStream()

  List<String> list = new ArrayList<>();

  Stream<String> stream = list.stream();

 

2. 通过Arrays 中的静态方法stream() 获取数组流

  Employee[] emps = new Employee[10];

  Stream<Employee> stream = Arrays.stream(emps);

 

3. 通过Stream 类中的静态方法of()

  Stream<String> stream = Stream.of("aa", "bb", "cc");

 

4. 创建无限流

  1)迭代

  Stream<Integer> stream = Stream.iterate(0, x -> x+2);

  stream.limit(10).forEach(System.out::println);

  2) 生成

  Stream.generate(() -> Math.random()).limit(5).forEach(System.out.println);

 

二、中间操作

多个中间操作可以连接形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”(延迟加载)。

  List<Employee> employees = Arrays.asList(new Employee()...);

筛选与切片:

1. fileter   ——  接受Lambda,从流中排除某些元素

内部迭代:迭代操作由Stream API完成

中间操作(不执行任何操作):

  Stream<Employee> stream = employees.stream().filter(e -> e.getAge > 35);

  Stream<Employee> stream = employees.stream().filter(e -> {

    System.out.println("执行中间操作"); // 中间操作在没有终止操作的情况下不会执行

    return e.getAge > 35;

  });

终止操作(一次性执行全部内容,即“惰性求值”):

  stream.forEach(System.out::println); 

 

外部迭代:

  Iterator<Employee> it = employees.iterator();

  while(it.hasNext()) {

    System.out.println(it.next());

  }

 

2. limit     ——  截断流,使其元素不超过给定数量

  employees.stream()

         .filter(e -> e.getSalary() > 5000)

         .limit(2)

         .forEach(System.out::println);

  employees.stream()

         .fileter(e -> {

           System.out.println("短路"); // || 满足了就不执行

           return e.getSalary() > 5000;  

         }).limit(2).forEach(System.out::println);

 

3. skip(n) ——  跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n) 互补

  employees.stream().filter(e -> e.getSalary() > 5000).skip(2).forEach(System.out::println);

 

4. distinct ——  筛选,通过流所生成的元素的hashCode() 和equals() 去除重复元素

  employees.stream().filter(e -> e.getSalary() > 5000).skip(2).distinct().forEach(System.out:println);

 

Stream

标签:去除   distinct   stream   next   strong   计算   ext   数据   tin   

原文地址:https://www.cnblogs.com/xzjl-23/p/14290113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!