Files
logseq-old/pages/Java8实战.md
2024-06-17 22:24:52 +08:00

6.2 KiB
Raw Permalink Blame History

  • Java 8新特性
    • Steam API
      • 流处理
        • Stream
        • 类似流水线
        • 可以将输入不相关的部分拿到几个CPU内核上执行
      • 不能访问共享的可变数据
    • 向方法传递代码的技巧
    • 接口中的默认方法
    • 函数
      • 通过::直接调用该方法
      • 匿名函数
      • 传递方法
  • 通过行为参数化传递代码
    • 一个方法接受不同的行为作为参数,并在内部使用
    • 可以使代码更好的适应不断变化的需求
    • JavaAPI包含排序,线程等多种不同行为进行参数化的方法
  • Lambda表达式
    • 特点
      • 简洁
      • 函数
      • 传递
      • 匿名
    • 组成部分
      • 参数列表
      • 箭头
      • 主体
    • 使用范围
      • 函数式接口
        • java.util.function
          • Predicate
            • test方法
            • 接受T
            • 返回boolean
            • filter方法
          • Consumer
            • accept方法
            • 接受T
            • void返回
            • foreach方法
          • Function
            • apply方法
            • 接受T
            • 返回R
            • map方法
          • Supplier
            • 无输入
            • 返回T
          • 其他函数式接口
        • 定义一个抽象方法的接口
          • 只有一个抽象方法就是函数式接口
          • 通过@FunctionalInterface可在编译时检查
        • Comparator
        • Runable
        • Callable...
      • 以内联形式直接实现函数式接口的抽象方法
    • 环绕执行
      • 打开->处理->关闭
    • 异常处理
      • 任何函数式接口都不允许抛出受检异常
      • 需要抛出异常处理
        • try-catch块
        • 定义自己的函数式接口
    • 类型检查
      • 检查入参和出参
      • 抛出异常也要和throw语句匹配
      • Void兼容规则
      • 局部变量
        • 需要为final或最终的
        • 使用Lambda时是在另一个线程中使用,访问的为副本
    • 方法引用
      • 使用::直接应用方法
      • 静态方法
      • 实例类型实例方法
      • 现有对象的实例方法
  • 引入流
    • 以声明式方式处理数据集合
      • 声明性--更简洁,更易读
      • 可复合--更灵活
      • 可并行--性能更好
    • stream方法
      • filter
      • map
      • limit
      • collect
    • 从支持数据处理操作的源生成的元素序列
      • 只能遍历一次
      • 外部迭代
        • 使用for-each或iterator
      • 内部迭代
    • 中间操作
      • 返回另一个流
      • filter
      • sorted
    • 终端操作
      • 从流生成结果LIst Integer Void
      • foreach
      • collect
  • 使用流
    • 筛选和切片
      • 筛选filter
      • 筛选各异的流distinct
      • 截短limit
      • 跳过skip
        • 跳过前n个元素
    • 映射
      • 对每一个元素应用函数map
      • 扁平化flatMap(Arrays::stream)
        • 将流中的每个值都换成另一个流,再合成一个
    • 查找和匹配
      • anyMatch返回boolean
      • allMatch
      • noneMatch
      • findAny
      • findFirst
    • 归约
      • reduce
        • 求和reduce(0, (a, b) -> a+b )
        • 求积reduce(1, (a, b) -> a*b )
        • 最大值reduce(Integer::max)
        • 最小值reduce(Integer::min)
    • 原始类型流特化
      • mapToInt
        • 返回IntStream可以使用sum()求和
        • 默认值OptionalInt
      • mapToDouble
      • mapToLong
      • 转化回对象流
        • boxed()
      • 数值范围
        • range不包含结束值
        • rangeClosed包含结束值
      • 勾股数生成
    • 构建流
      • Stream.of()
      • Stream.empty()
      • Stream.iteratoe
      • Stream.generate
  • 用流收集数据
    • collect
      • Collectors
        • toList
        • counting
        • maxBy
        • minBy
        • summingInt求和
        • summingDouble
        • averageInt求平均
        • averageDouble
        • summarizingInt得到个数求和平均。最大最小
        • summarizingDouble
        • joining连接所有字符串 joining(“, ”)
      • reducing
    • 分组
      • groupingBy
      • 多级分组
        • 二级groupingBy
        • counting
        • collectingAndThen装换optional类型
    • 分区
      • partitioningBy
        • 返回boolean
  • 并行数据处理与性能
    • parallelStream
    • 转为并行parallel
    • 转为顺序流sequential()
    • 使用了默认的ForkJoinPool
      • 线程数为处理器数量Runtime.getRuntime().availableProcessors()
    • 性能
      • 正确使用并行流加速
      • 避免装箱操作
      • 避免共享可变状态
      • 考虑顺序流
      • 数据量大小
      • 数据结构是否易于分解
        • LinkedList拆分需要遍历
      • 合并步骤代价大小
    • 分支/合并框架
      • 对一个任务调用回阻塞调用方
      • 工作窃取
        • 当一个线程空闲时获取其他线程的任务,避免等待
      • Spliterator可分迭代器
  • 重构、测试和调试
    • 设计模式
      • 策略模式
        • 一个代表算法的接口
        • 一个或多个该接口的具体实现
        • 一个或多个使用策略对象的客户
      • 模板方法
        • 继承某个抽象方法提供差异化实现
      • 观察者模式
        • 当某些事件发生式,一个对象(主题)需要自动通知其他多个对象(观察者)
      • 责任链模式
        • 一个处理对象将一些工作完成之后传递给另一个对象
        • Lambda andThen方法
      • 工厂模式
        • 无需暴露实例化的逻辑就可以完成对象的创建
    • 调试
      • 查看栈跟踪
      • 输出日志
  • 默认方法
    • 已发布的API,当一个接口修改时,实现类客户也许要实现该方法
    • 接口可以声明静态方法
    • 接口可在声明方法的同时提供实现
      • 通过default修饰符声明
    • 使用用例
      • 可选方法,用不上的就不实现
    • 行为的多继承
    • 默认方法的冲突
      • 类中的方法优先级最高
      • 子接口的优先级更高,更具体,继承的要更高
      • 显示覆盖和调用期望的方法选择实现
        • X.super.m()
        • 实习后选择使用哪个
      • 菱形继承
  • 用Optional取代null
    • 防御式检查减少NullPointException
    • 安全导航操作符
    • 可以将字段声明为Option类
    • 创建Optional对象
      • Optional.empty()
      • Optional.of(car)
      • Optional.ofNullable(car)
    • 用map获取和转换值
      • Optional.map(Insurance::getName)
      • flatMap避免Optional<Optional>类型
      • 在类的变量使用Optional无法序列化会报错 background-color:: yellow
    • 解引用Optional
      • get()
      • orElse(T other)
      • orElseGet()
      • orElseThrow()
      • ifPresent()
    • Optional对象组合
    • filter
  • CompletableFuture组合式异步编程
    • Future接口
  • 新的日期和时间api
  • 函数式的思考
  • 函数式编程的技巧
  • 面向对象和函数式编程的混合Java8和Scale的比较
  • 结论及Java未来