245 lines
6.2 KiB
Markdown
Executable File
245 lines
6.2 KiB
Markdown
Executable File
- Java 8新特性
|
||
- Steam API
|
||
- [[流处理]]
|
||
- Stream<T>
|
||
- 类似流水线
|
||
- 可以将输入不相关的部分拿到几个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<Car>>类型
|
||
- 在类的变量使用Optional无法序列化会报错
|
||
background-color:: yellow
|
||
- 解引用Optional
|
||
- get()
|
||
- orElse(T other)
|
||
- orElseGet()
|
||
- orElseThrow()
|
||
- ifPresent()
|
||
- Optional对象组合
|
||
- filter
|
||
- CompletableFuture组合式异步编程
|
||
- Future接口
|
||
- 新的日期和时间api
|
||
- 函数式的思考
|
||
- 函数式编程的技巧
|
||
- 面向对象和函数式编程的混合:Java8和Scale的比较
|
||
- 结论及Java未来 |