【Java8 新特性 2】函数式接口 + Lamda表达式推导过程

1、静态方法

接口中可以有一个或多个静态方法,这不会影响到函数式接口的定义。

2、default方法

在 Java8 之后,接口允许定义由 default 修饰的默认方法,并且不强制实现类重写此方法,这些方法也不会影响到函数式接口的定义。

默认方法不能被直接调用,可以由实现类调用。

注意事项

(1)当一个实现类实现了多个接口,多个接口里都有相同的默认方法时,实现类必须重写该默认方法,否则编译错误。

(2)实现类使用super关键字指定使用哪个接口的默认方法。

3、函数式接口支持继承

函数式接口支持继承,可以继承多个父接口,但是每个父接口只能有一个抽象方法,且必须是相同的抽象方法。

三、函数式接口的意义


我是这么理解的,java是面向对象的,但是为了写起来方便,需要向一个方法传递一个方法,但是实际上并不能传递方法,而是传递了只有一个抽象方法的接口的实现类的对象,这样就做到类似传递方法了,其实lanmada就是一个对象

四、四种核心的函数式接口


1、功能性接口Function

接收一个功能参数t,并返回一个功能结果R。

package java.util.function;

import java.util.Objects;

@FunctionalInterface

public interface Function<T, R> {

R apply(T t);

default Function<V, R> compose(Function<? super V, ? extends T> before) {

Objects.requireNonNull(before);

return (V v) -> apply(before.apply(v));

}

default Function<T, V> andThen(Function<? super R, ? extends V> after) {

Objects.requireNonNull(after);

return (T t) -> after.apply(apply(t));

}

static Function<T, T> identity() {

return t -> t;

}

}

2、断言性接口:Predicate

主要用到test方法 其中参数t为输入参数,如果输入参数符合断言则返回true,否则false

package java.util.function;

import java.util.Objects;

@FunctionalInterface

public interface Predicate {

boolean test(T t);

default Predicate and(Predicate<? super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) && other.test(t);

}

default Predicate negate() {

return (t) -> !test(t);

}

default Predicate or(Predicate<? super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) || other.test(t);

}

static Predicate isEqual(Object targetRef) {

return (null == targetRef)

? Objects::isNull
object -> targetRef.equals(object);

}

}

3、供给性接口:Supplier

不接收任何参数 但有返回值

@FunctionalInterface

public interface Supplier {

T get();

}

4、消费性接口:Consumer

只接收一个参数t,但是没有返回值。

五、Lambda表达式


Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。

JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。

简单明了,函数式接口就是为了Lambda 表达式而生的。

六、Lambda表达式的推导过程


1、匿名内部类 --> Lambda表达式 --> 简化Lambda表达式

package java8.lamda;

public class LamdaTest {

public static void main(String[] args) {

//匿名内部类

IStudent student = new IStudent() {

@Override

public void study(String technology,int time) {

System.out.println(“匿名内部类,”+technology+time);

}

};

student.study(“java”,8);

//Lambda表达式改造(将类名和方法名去掉)

IStudent student1 = (String technology,int time)->{

System.out.println(“Lambda表达式改造(将类名和方法名去掉)”+technology+time);

};

student1.study(“java”,8);

//一级进化(去掉数据类型)

IStudent student2 = ((technology, time) -> {

System.out.println(“一级进化(去掉数据类型)”+technology+time);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值