Stream的创建

Stream概念

是数据的渠道,用于操作数据源(集合、数组等)所生成的元素序列,Stream有一个计算的过程

特点

Stream自己不会存储元素 Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行

Stream的获取

Collection存在两种获取流的方式
获取顺序流
 List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
获取一个并行流
Stream<String> parallelStream = list.parallelStream();
数组存在一种获取流的方式
Integer[] nums = new Integer[10];
Stream<Integer> stream1 = Arrays.stream(nums);
Stream中的静态方法创建流
 Stream<Integer> stream2 = Stream.of(1,2,3,4,5,6);
创建无限流
迭代:参数0是起始位置,第二个参数是迭代的,每次加2
  Stream<Integer> stream3 = Stream.iterate(0, (x) -> x + 2).limit(10);
stream3.forEach(System.out::println);
生成:生成随机数
Stream<Double> stream4 = Stream.generate(Math::random).limit(2);
stream4.forEach(System.out::println);

中间操作

筛选

惰性求值
添加数据
  List<Employee> emps = Arrays.asList(
          new Employee(102, "李四", 59, 6666.66),
          new Employee(101, "张三", 18, 9999.99),
          new Employee(103, "王五", 28, 3333.33),
          new Employee(104, "赵六", 8, 7777.77),
          new Employee(104, "赵六", 8, 7777.77),
          new Employee(104, "赵六", 8, 7777.77),
          new Employee(105, "田七", 38, 5555.55)
  );
过滤并输出过滤后的数据
   public void test2(){  
      Stream<Employee> stream = emps.stream()
              .filter((e) -> {
                  System.out.println("测试中间操作");
                  return e.getAge() <= 35;
              });
      stream.forEach(System.out::println);
  }

只有当终止操作时(forEach),所有的中间操作会一次性的全部执行,称为“惰性求值” ,如果将打印语句去掉,中间操作是不会执行的

过滤后输出的结果是年龄小于等于35的员工的信息

截断流

    @Test
  public void test4(){
      emps.stream()
              .filter((e) -> {
                  return e.getSalary() >= 5000;
              }).limit(3)
              .forEach(System.out::println);
  }

只要是找到了三个元素以后就不再进行迭代了,可以提高效率

跳过元素

  @Test
  public void test5(){
      emps.parallelStream()
              .filter((e) -> e.getSalary() >= 5000)
              .skip(2)
              .forEach(System.out::println);
  }

返回一个去除掉前n个元素的流,若元素的个数不足n个,则返回一个空流。

筛选元素

   @Test
  public void test6(){
      emps.stream()
              .distinct()
              .forEach(System.out::println);
  }

去除重复元素,要保证实体类重写了equals和HashCode方法

映射

Map
  <R> Stream<R> map(Function<? super T, ? extends R> mapper);
  @Test
  public void test(){
      List<String> list=Arrays.asList("as","zhai","hh","hub");
      list.stream()
              .map((str)->str.toUpperCase())
              .forEach(System.out::println);
  }

map—接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。

AS
ZHAI
HH
HUB

FlatMap

如果Map调用的方法的返回值还是一个流,那么该Map是一个包含多个流的Map。如果用FlatMap的话,所有的流都会被拆分为元素放入到Map中,只有一个流。

 

 

 

 

 

每个人都会有一段异常艰难的时光 。 生活的压力 , 工作的失意 , 学业的压力。 爱的惶惶不可终日。 挺过来的 ,人生就会豁然开朗。 挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。 ——杨绛
原文地址:https://www.cnblogs.com/zhai1997/p/14499178.html