Java8

关于函数式接口

  • 如果一个接口只有一个抽象方法,那么该方法就是一个函数式接口
  • 只有一个抽象方法的意义所在是:使得实现类只实现这一个方法,使实现类看上去像一个函数,由此可推出,如果接口中有已经实现的方法(默认方法/静态方法),或者不用实现类直接实现的方法,那么不管接口中有几个方法,这个接口都是函数式接口
  • 如果我们在某个接口上声明了FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口
  • 如果某个接口只有一个抽象方法,但是我们没有给该函数声明FunctionalInterface注解,那么编译器依旧会将该函数认定为函数式接口
  • 函数式接口中可以有默认方法(带default关键字描述的方法)
  • 如果一个接口中有两个抽象方法,但是其中一个重写了java.lang.object中的public方法(比如toString),这个接口还是函数式接口
  • 解释上面一条:因为任何实现函数式接口的类都会直接或间接地继承Object类,所以在实现类中,Object会自动实现函数式接口中重写Object中的public类(比如toString),这样,实现类还是只实现了一个方法,那还是满足函数式接口的要求
  • 函数式接口的实现可以通过lambda表达式,方法引用

Lambda表达式

  • 形式(type param1, type param2…)->{ doSomething }
  • 如果参数只有一个,类型可以推导,参数圆括号可以省略,如果方法体只有一条语句,可以写成表达式形式,花括号可以省略(但不能带return)
  • Lambda表达式是对象,不是函数
  • Lambda表达式只能是函数式接口的实现类

默认方法

  • 在接口中的已经实现的方法就是默认方法,有default修饰方法
  • 默认方法存在的意义是保持Java的向后兼容,例如如果为已有的类添加新的方法,如果直接在该类实现的接口中添加抽象方法,然后在实现类中实现的话,那么其他所有实现该接口的类就都得实现这个方法,先不说这是一个如果工程浩大的项目,更危险的是如果我自己的定义的实现了该接口的类,在移植到新的JDK中运行时,我的程序就会因为没有实现接口中新增的方法而崩溃,这这就所谓保持向后兼容性

外部迭代和内部迭代

  • 讲到函数式接口和Lambda表达式,那么就得提一下外部迭代和内部迭代
    什么是外部迭代呢?就是Java8以前的版本中遍历容器的方法,foreach和Iterator迭代,这两种方法看似没有索引下标,但其实都是有序的遍历,它规定了JVM遍历容器的方法,这有什么不好呢,不好在这样的遍历方法对于JVM来说并不是最好的,深入JVM后知道,JVM对于一些操作在底层是会重排序指令的,所以外部排序不好在于规定了JVM的执行流程,使得遍历只能串行执行.
  • 内部迭代就是对流的操作,这些操作接受一个Lambda表达式作为参数,指定对容器中元素的操作,而在使用中,完全接触不到遍历有关的操作,这就是内部迭代,将遍历的执行流程完全交给JVM,以得到更高的效率.
  • 内部迭代在我的理解中很像spark里的操作向数据靠拢的感觉,而外部迭代像是数据向操作靠拢.外部迭代取出容器中的每个元素,然后进行操作,而内部迭代将操作嵌入流中,将操作交给流去执行
  • 内部迭代和外部迭代其实是对流和集合的操作,集合关注的是对象的存储,有一种静态的感觉,需要我们去拿出数据,操作数据,而流关注的是对象的计算,我们将计算过程用lambda表达式表示,然后交给流,流进行处理.

Optional

  • 一般的使用就是Optional optional = Optional.of(value) / ofNullable(value) / empty();
  • 在判定空指针时推荐使用ifPresent(lambda表达式) 而不是 if( optional.isPresent ){ dosomething },即使用函数式编程风格,而不是面向对象风格
  • 如果optional为空,使用orElse(another value) 或 orElseGet(lambda表达式)
  • 如果一个方法的返回是一个集合,那么在方法中使用空集合代替null作为异常返回
  • 不要将Optional类型对象对位方法参数,或者类中的成员变量,而只作为方法返回,因为Optional并没有实现Serializable接口,无法序列化.

方法引用

  • 方法引用是Lambda的一个语法糖
  • 可以讲方法引用看做一个函数指针,就是C/C++中的函数指针,方法引用主要分为四类:
    1 : 类名 :: 静态方法名
    2 : 对象名 :: 实例方法名
    3 : 类名 :: 实例方法名
    4: 构造方法引用 类名::new
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值