资讯专栏INFORMATION COLUMN

「Java 8 函数式编程」读书笔记——类库

MingjunYang / 576人阅读

摘要:本书第四章的读书笔记本章主要阐述如何使用表达式基本类型考虑到装箱类型过于占用内存提供了针对基本类型的操作以达到优化的效果如方法对基本类型做特殊处理的方法在命名上有明确规范如果返回类型为基本类型则在基本类型名称前面加如果参数类型是基本类型则不

本书第四章的读书笔记, 本章主要阐述: 如何使用Lambda表达式.

基本类型

考虑到装箱类型过于占用内存, JDK提供了针对基本类型的操作, 以达到优化的效果, 如mapToLong方法.

对基本类型做特殊处理的方法在命名上有明确规范:

如果返回类型为基本类型, 则在基本类型名称前面加To

如果参数类型是基本类型, 则不加前缀只需类型名即可

如果敢接函数使用基本类型, 则在操作名后加To, 再加基本类型名, 如mapToLong

summaryStatistics方法

这些为基本类型进行优化的Stream还有一些额外的方法, 避免重复实现一些通用方法, 比如summaryStatistics方法.

public static void printSummary(List productions) {
  DoubleSummaryStatistics priceStats = productions.stream()
    .mapToDouble(prod -> prod.getPrice())
    .summaryStatistics();
  System.out.printf("max: %f, min: %f, ave: %f, sum: %f",
                   priceStats.getMax(),
                   priceStats.getMin(),
                   priceStats.getAberage(),
                   priceStats.getSum());
}
重载解析

Lambda表达式作为参数时, 其类型由它的目标类型(方法的参数类型)推导得出, 推导过程遵循如下规则:

如果只有一个可能的目标类型, 由相应函数接口里的参数类型推导得出

如果有多个可能的目标类型, 由最具体的类型推导得出

如果有多个可能的目标类型且最具体的类型不明确, 则需要人为指定类型

@FunctionalInterface

该注解会强制javac检查一个接口是否符合函数接口的标准. 如果该注解被添加给一个枚举类型, 类或者另一个注解, 或者接口包含不止一个抽象方法, javac就会报错.

默认方法 产生原因

由于集合框架的基本接口如Collection Map等都新增了stream方法, 在以前的版本中, 第三方的类库如果实现了Collection这样的接口, 必须新增stream方法的实现, 否则无法通过Java 8的编译.

为了避免这种情况, Java 8中添加的新的语言特性: 默认方法

编写方法

Java 8中的任何接口都可以添加默认方法, 使用default关键字修饰, 比如forEach方法:

default void forEach(Consumer action) {
  for (T t : this) {
    action.accept(t);
  }
}

因为接口没有成员变量, 所以默认方法只能通过调用子类的方法来修改子类本身.

默认方法的重写

假设:

接口A有默认方法a,

接口B扩展了接口A, 并重写了方法a

C实现接口A, 并重写方法a

D实现接口B, 并重写方法a

没有重写的情况

一个类实现接口A, 则会调用接口A的实现

一个类实现接口B, 则会调用接口B的实现

继承于C D的类, 无论是否实现了接口AB, 都将会调用C D的实现

实现AB, 但没有继承CD的类将无法通过编译

有重写的情况

无论继承情况如何, 只要重写了默认方法, 都将调用自己的实现

三定律

类胜于接口

子类胜于父类

没有规则三, 如果上面两条不适用, 子类需要实现该方法, 或声明为抽象方法

接口的静态方法

如果一个方法有充分的语义原因和某个概念相关, 那么就应该将方法和相关的类或接口放在一起, 而不是放到另一个工具类中. 基于这个原因, Java 8提供了接口的静态方法的支持. Stream接口中就包含多个静态方法用于生成Stream对象.

Optional

Optional是为核心类库新设计的一个数据类型, 用于替换null值. 它可以接收一个泛型参数.

调用get方法获得泛型类型的对象.

isPresent方法判断是否为空

orElse orElseGet orElseThrow方法可以自由定制为空时的返回值/抛出异常

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66619.html

相关文章

  • Java 8 函数编程读书笔记——数据并行化

    摘要:限制编写并行流,存在一些与非并行流不一样的约定。底层框架并行流在底层沿用的框架,递归式的分解问题,然后每段并行执行,最终由合并结果,返回最后的值。 本书第六章的读书笔记,也是我这个系列的最后一篇读书笔记。后面7、8、9章分别讲的测试、调试与重构、设计和架构的原则以及使用Lambda表达式编写并发程序,因为笔记不好整理,就不写了,感兴趣的同学自己买书来看吧。 并行化流操作 关于并行与并发...

    leone 评论0 收藏0
  • java 8 实战》读书笔记 -第十四章 函数编程的技巧

    摘要:但是,最好使用差异化的类型定义,函数签名如下其实二者说的是同一件事。后者的返回值和初始函数的返回值相同,即。破坏式更新和函数式更新的比较三的延迟计算的设计者们在将引入时采取了比较特殊的方式。四匹配模式语言中暂时并未提供这一特性,略。 一、无处不在的函数 一等函数:能够像普通变量一样使用的函数称为一等函数(first-class function)通过::操作符,你可以创建一个方法引用,...

    nemo 评论0 收藏0
  • Java 8 函数编程读书笔记——lambda表达

    摘要:本文是函数式编程第二章的读书笔记。的语法简化了使用匿名内部类时的模板代码,让程序员专注于编写想要执行的行为,也让代码更加简洁易读。中最重要的函数接口类型推断为新成员表达式提供了类型推断的支持,在不需要声明参数类型的表达式中表现的有为明显。 本文是「Java 8 函数式编程」第二章的读书笔记。 Lambda引入的变化 Lambda表达式,是一种紧凑的、传递行为的方式,从编程思想上来讲,...

    lx1036 评论0 收藏0
  • Java 8 函数编程读书笔记——流

    摘要:本文是函数式编程第三章的读书笔记,章名为流。正确使用表达式明确要达成什么转化,而不是说明如何转化没有副作用只通过函数的返回值就能充分理解函数的全部作用函数不会修改程序或外界的状态获取值而不是变量避免使用数组逃过的追杀,应该考虑优化逻辑 本文是「Java 8 函数式编程」第三章的读书笔记,章名为流。本章主要介绍了外部迭代与内部迭代以及常用的高阶函数。 外部迭代与内部迭代 外部迭代 过去我...

    qpwoeiru96 评论0 收藏0
  • java 8 实战》读书笔记 -第十三章 函数的思考

    摘要:当我们希望能界定这二者之间的区别时,我们将第一种称为纯粹的函数式编程,后者称为函数式编程。函数式编程我们的准则是,被称为函数式的函数或方法都只能修改本地变量。另一种观点支持引用透明的函数式编程,认为方法不应该有对外部可见的对象修改。 一、实现和维护系统 1.共享的可变数据 如果一个方法既不修改它内嵌类的状态,也不修改其他对象的状态,使用return返回所有的计算结果,那么我们称其为纯粹...

    Donne 评论0 收藏0

发表评论

0条评论

MingjunYang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<