Files
logseq/pages/Java8实战.md

245 lines
6.2 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
- 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未来