6.2 KiB
6.2 KiB
- Java 8新特性
- 通过行为参数化传递代码
- 一个方法接受不同的行为作为参数,并在内部使用
- 可以使代码更好的适应不断变化的需求
- JavaAPI包含排序,线程等多种不同行为进行参数化的方法
- Lambda表达式
- 特点
- 简洁
- 函数
- 传递
- 匿名
- 组成部分
- 参数列表
- 箭头
- 主体
- 使用范围
- 函数式接口
- java.util.function
- Predicate
- test方法
- 接受T
- 返回boolean
- filter方法
- Consumer
- accept方法
- 接受T
- void返回
- foreach方法
- Function
- apply方法
- 接受T
- 返回R
- map方法
- Supplier
- 无输入
- 返回T
- 其他函数式接口
- Predicate
- 定义一个抽象方法的接口
- 只有一个抽象方法就是函数式接口
- 通过@FunctionalInterface可在编译时检查
- Comparator
- Runable
- Callable...
- java.util.function
- 以内联形式直接实现函数式接口的抽象方法
- 函数式接口
- 环绕执行
- 打开->处理->关闭
- 异常处理
- 任何函数式接口都不允许抛出受检异常
- 需要抛出异常处理
- 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)
- reduce
- 原始类型流特化
- mapToInt
- 返回IntStream可以使用sum()求和
- 默认值OptionalInt
- mapToDouble
- mapToLong
- 转化回对象流
- boxed()
- 数值范围
- range不包含结束值
- rangeClosed包含结束值
- 勾股数生成
- mapToInt
- 构建流
- Stream.of()
- Stream.empty()
- Stream.iteratoe
- Stream.generate
- 筛选和切片
- 用流收集数据
- collect
- Collectors
- toList
- counting
- maxBy
- minBy
- summingInt求和
- summingDouble
- averageInt求平均
- averageDouble
- summarizingInt得到个数,求和,平均。最大,最小
- summarizingDouble
- joining连接所有字符串
joining(“, ”)
- reducing
- Collectors
- 分组
- groupingBy
- 多级分组
- 二级groupingBy
- counting
- collectingAndThen装换optional类型
- 分区
- partitioningBy
- 返回boolean
- partitioningBy
- collect
- 并行数据处理与性能
- 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未来