今日学习目标

  • Lambda表达式
  • Stream流
  • Optional类
  • 多线程的入门

    1 Lambda表达式

    1.1Lambda表达式特点

  • Lambda表达式可以理解为匿名内部类的简化,但本质有区别

面向对象思想 强调的是用对象去完成某些功能
函数式编程思想 强调的是结果 , 而不是怎么去做

1.2 函数式接口

  • 只有一个抽象方法需要重写的接口
  • 允许有其他非抽象方法
  • 为了标识接口是一个函数式接口,可以在接口上面加个注解:@FunctionalInterface

    1.3 Lambda表达式的使用

  • 必须存在一个函数式接口:有且只有一个抽象方法

  • 格式: ()->{}

    • 小括号代表的是函数式接口重写方法的参数
    • ->代表指向
    • 大括号代表的是函数式接口重写方法的方法体

      2 Stream流

      作用 : 主要可以对集合或者数组中元素的筛选做简化

      2.1 Stream流的三类方法

  • 获取功能

    • 创建一条流水线,并把数据放到流水线上准备进行操作
  • 中间方法
    • 流水线上的操作
    • 一次操作之后可以连接其他操作
  • 终结方法
    • 一个Stream流只能有一个终结方法
    • 流水线上的最后一个操作

      第一类 : 获取方法

      1. private static void method1() {
      2. // 可以使用Collection接口中的默认方法stream()生成流
      3. ArrayList<String> list = new ArrayList<>();
      4. list.add("迪丽热巴");
      5. list.add("古力娜扎");
      6. list.add("马尔扎哈");
      7. list.add("欧阳娜娜");
      8. list.stream().forEach(s -> System.out.println(s));
      9. }
      10. }

      第二类 : 中间方法

  1. Stream filter(Predicate predicate):用于对流中的数据进行过滤
    Predicate接口中的方法 : boolean test(T t):对给定的参数进行判断,返回一个布尔值
    2. Stream limit(long maxSize):截取指定参数个数的数据
    3 Stream skip(long n):跳过指定参数个数的数据
    4 static Stream concat(Stream a, Stream b):合并a和b两个流为一个流
    5 Stream distinct():去除流中重复的元素。依赖(hashCode和equals方法)
    6 Stream sorted () : 将流中元素按照自然排序的规则排序
    7 Stream sorted (Comparator<? super T> comparator) : 将流中元素按照自定义比较器规则排序
    8 Stream map(Function<? super T,? extends R> mapper) : 将流中的元素类型进行转换

    第三类 : 终结方法

    1 void forEach(Consumer action):对此流的每个元素执行操作Consumer接口中的方法 void accept(T t):对给定的参数执行此操作
    2 long count():返回此流中的元素数

    2.2 Stream流中的收集方法

  • 单列集合
    • 可以使用Collection接口中的默认方法stream()生成流
    • default Stream stream()
  • 双列集合
    • 双列集合不能直接获取 , 需要间接的生成流
    • 可以先通过keySet或者entrySet获取一个Set集合,再获取Stream流
  • 数组
    • Arrays中的静态方法stream生成流
  • 把同一种数据类型多个数据放到stream

    • Stream类中的静态of方法 , 把多个数据放在stream流上

      2.3 Stream流中的收集

  • public static Collector toList():把元素收集到List集合中
    public static Collector toSet():把元素收集到Set集合中

    3 Optional类

    3.1Optional类的概念和作用

  • Optional类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

  • 优势 : Optional 类的引入很好的解决空指针异常 , 同样Optional类可以对空值判断形成一种规范

    3.2Optional类的常用方法

  • public static Optional of(T value)

    • 通过非null值构建一个Optional容器,注意value不能不为null否则抛出异常
  • public static Optional ofNullable(T value)
    • 通过指定值构建一个Optional容器官如果值为null则返回Optional.empty
  • public T orElse(T other)
    • 返回值如果存在,否则返回other
  • public boolean isPresent()
    • 如果对象为null返回的是false,如果对象不为null返回的是true
  • public T get()

    • 如果 Optional中存在值,则返回值,否则抛出 NoSuchElementException

      4 多线程入门

      4.1 多线程相关的概念

  • 并发与并行

    • 并行:在同一时刻,有多个任务在多个CPU上同时执行。
    • 并发:在同一时刻,有多个任务在单个CPU上交替执行。
  • 进程与线程

    • 进程:就是操作系统中正在运行的一个应用程序。
    • 线程:就是应用程序中做的事情。比如:360软件中的杀毒,扫描木马,清理垃圾。

      4.2 多线程的创建方式

      4.2.1 继承Thread方式

  • 基本步骤:

    • 创建一个类继承Thread类.
    • 在类中重写run方法(线程执行的任务放在这里)
    • 创建线程对象,调用线程的start方法开启线程。
    • 执行程序,观察控制台的打印数据的现象

      4.2.2 实现Runable方式

  • 构造方法

    • public Thread(Runnable target)
    • public Thread(Runnalbe target , String name)
  • 实现步骤

    • 定义任务类实现Runnable,并重写run方法
    • 创建任务对象,使用含有Runnable参数的构造方法,创建线程对象并指定任务。
    • 调用线程的start方法,开启线程

      4.2.3 Thread类中常用方法

  • String getName():返回此线程的名称

  • Thread类中设置线程的名字
    • void setName(String name):将此线程的名称更改为等于参数 name
    • 通过构造方法也可以设置线程名称
  • public static Thread currentThread():返回对当前正在执行的线程对象的引用
  • public static void sleep(long time):让线程休眠指定的时间,单位为毫秒 | 实现方式 | 优点 | 缺点 | | —- | —- | —- | | 继承Thread类 | 代码实现方式比较简单,可以直接使用Thread类中功能 | 扩展性较差,只能继承Thread类,任务执行完毕没有返回值结果,有异常只能捕获 | | 实现Runnable接口 (常用) | 代码实现方式比较简单,扩展性较强因为还可以继承其他的类 | 不能直接使用Thread类中的功能,任务执行完毕没有返回值结果,有异常只能捕获 | | 实现Callable接口 | 展性较强因为还可以继承其他的类,任务执行完毕会有一个返回值结果,如任务中出现 | 实现太过复杂,不能直按使用Thread类中的功能 |

5. 当日问题小结

5.1 当日遇到的问题

5.2 出现问题原因

5.3 解决问题方案