- 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无法序列化会报错 background-color:: yellow - 解引用Optional - get() - orElse(T other) - orElseGet() - orElseThrow() - ifPresent() - Optional对象组合 - filter - CompletableFuture组合式异步编程 - Future接口 - 新的日期和时间api - 函数式的思考 - 函数式编程的技巧 - 面向对象和函数式编程的混合:Java8和Scale的比较 - 结论及Java未来