Stream是一组用来处理数组、集合的API

java8之所以费那么大功夫引入函数式编程,原因有二:
-代码简介函数式编程写出的代码简洁且意图明确,使用stream接口,让你从此告别for循环
-多核友好,java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。

Stream特性

1、不是数据结构,没有内部存储
2、不支持索引访问
3、延迟计算,主要体现在不进行终止操作的时候,不会进行内部运算
4、支持并行
5、很容易生成数组或者集合(List、Set)
6、支持过滤、查找、转换、汇总、聚合等操作

Stream运行机制

1、Stream分为源source、中间操作、终止操作(源主要是生成流)
2、流的源可以是一个数组、一个集合、一个生成器方法,一个I/O通道等等。
3、一个流可以有0个或者多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用。一个流只会有一个终止操作
4、Stream只有遇到终止操作,它的源才开始执行遍历操作

Stream的5中创建方式:

**
1、通过数组
2、通过集合
3、同伙Stream.generate()方法来创建
4、通过Stream.iteraate()方法来创建
5、其他API例如
String str=“luozhao你好啊”;
IntStream chars = str.chars();**

package com.ligong.stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.logging.XMLFormatter;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**

  • 一些声明信息

  • Description: Stream流的生成,一共有五种方法,例如数组生成、集合生成、API提供的generate()方法以及我们

  • ApiZ中迭代器的方法。

  • date: 2021/8/11 16:15

  • @author luozhao

  • @since JDK 1.8
    */
    public class TestGenStream {
    public static void main(String[] args) {
    System.out.println(“这是数组转流------------”);
    gen1();
    System.out.println(“这是集合转流------------”);
    gen2();
    System.out.println(“这是StreamAPI中generate()方法------------”);
    gen3();
    System.out.println(“这是API中的迭代器方式------------”);
    gen4();
    System.out.println(“这是Stream中的其他转成Stream子类方式------------”);
    gen5();
    }
    public static void gen1(){

     String[] Str={"王五","李四","李想","曹笠成","姚宝柱子"};
     Stream<String> stringStream=Stream.of(Str);
     stringStream.forEach(System.out::println);
    

    }
    public static void gen2(){
    List list= Arrays.asList(“1”,“2”,“3”,“4”);
    list.stream().forEach(System.out::println);

    }
    public static void gen3(){
    //gen
    Stream generate = Stream.generate(() -> 1);
    generate.limit(10).forEach(System.out::println);
    }
    public static void gen4(){
    //gen
    Stream iterate = Stream.iterate(1, x -> x + 1);
    iterate.limit(10).forEach(System.out::println);
    }
    public static void gen5(){
    //gen
    String str=“luozhao你好啊”;
    IntStream chars = str.chars();
    //参数是一个对象方法引用
    chars.forEach(System.out::println);
    }
    }

Stream的常用操作:

package com.ligong.stream;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.Arrays;
import java.util.Optional;

/**

  • 一些声明信息

  • Description:

  • date: 2021/8/11 18:30

  • @author luozhao

  • @since JDK 1.8
    /
    public class TestCenterStream {
    public static void main(String[] args) {
    /
    **
    * 对流中的数据求和运算
    * 第一步把集合转换为流的形式
    * 通过filter过滤器,返回与给定谓词所匹配的流
    * mapToInt方法是把流转换为Int类型的流
    * sum方法可以对intStream类型的流进行求和
    */
    int sum = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().filter(
    x -> x % 2 == 0).mapToInt(x -> x).sum();
    System.out.println(sum);

     /**
      * 通过API方法max对流中的数据进行筛选,其中max中的参数是比较器,通过lambda表达式进行筛选
      */
      **比较器源码:**
      ![在这里插入图片描述](https://img-blog.csdnimg.cn/d23dea52c944425da34194f096303780.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbHBsdW96aGFvMTIz,size_16,color_FFFFFF,t_70)
    
     Optional<Integer> max = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().max((a, b) -> a - b);
     System.out.println(max.get());
    
     /**
      * 通过API方法max对流中的数据进行筛选,其中Mmin中的参数是比较器,通过lambda表达式进行筛选
      */
     Optional<Integer> min = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().min((a, b) -> a - b);
     System.out.println(min.get());
    

    }
    }
    打印匹配的任意一个符合能够整除2条件的数据
    打印余数=6的首个数据
    打印首个能与谓词i%2==匹配的数据

在这里插入图片描述
获取最大值,最小值,不用过滤器,用sort方法,一个是通过自定义比较器的方法一个是Stream类提供的方法。
在这里插入图片描述

Stream常用的中间操作API
**
1、过滤filter
2、去重distinct
3、排序sorted
4、截取limit、skip
5、转换map/flatMap
6、其他peek**

Stream常用的终止API

**
1、循环forEach
2、计算min、max、count、average
3、匹配anyMatch、allMatch、noneMatch、findFirst、findAny
4、汇聚reduce
5、收集器 toArray collect**

有些案例没有写,后面有时间爱你会写的。感觉还可以的话点赞收藏呀。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐