2021.02.04 第一阶段 22

1、JDK8的接口特性
2、Lambda表达式
3、函数式接口
4、StreamingAPI

一、JDK8的接口特性

(一)概述
1、JDK8接口中,不仅可以定义抽象方法,还能够定义非抽象方法
2、抽象方法的定义和以前一样,没有变化
3、非抽象方法有方法体,但是方法必需用default或者static修饰

public class Demo01_JDK8Interface {
}
	interface MyInter1 {
	void test1();
	default void test2() {
		System.out.println("哈哈哈");
	}
	public static void test3() {
		System.out.println("小年快乐");
	}
}
class Inter1 {
	//default void test2() {}
}

(二)default方法
1、原因:JDK8中有很多老接口,增加了很多新的方法,就会让编译不通过,并且一个类在继承一个父类的同时还能实现多个接口。为了不产生冲突和良好的兼容性,我们就在方法上加上默认的实现即default,并且default方法不会被强制重写。
2、使用规则:
(1)加上了default的方法在实现类中不会被强制重写,可以直接调用,即直接使用子类对象调用方法名称即可。
(2)特殊情况:
①实现类实现了多个接口,如果多个接口中具有相同声明的default方法,则我们需要在实现类中首先重写方法,之后需要指定沿用那个接口找那个的方法体。指定格式:【接口名.super.方法名】,用于指定使用那个接口中的那个方法的方法体
②在①中的特殊情况里,我们也可以不运用接口方法的实现,可以自己重新定义实现,将来执行就执行自己重新定义的实现
③类优先原则:当一个类继承父类并且实现多个接口时,接口中和父类中有同名的非抽象方法,在子类对象调用的时候,会默认执行父类方法的方法体
3、产生的影响:
(1)JDK8中接口可以有非抽象方法,抽象类可以有非抽象方法,单数按照java的继承和实现的原则,类只能继承一父类,但是可以实现多个接口,这样就弱化了抽象类的作用
(2)抽象类和接口的差别越来越小
(3)有了默认方法之后,大量的抽象类变成了接口

public class Demo01_JDK8Interface {
	public static void main(String[] args) {
		Inter2 inter2 = new Inter2();
		inter2.test3();
		inter2.test2();
	}
}
interface MyInter1 {
	default void test2() {
		System.out.println("这个是接口MyInter1的test2方法");
	}
	default void test3() {
		System.out.println("这个是接口MyInter1的test3方法");
	}
}
interface MyInter2 {
	default void test3() {
		System.out.println("这个是接口MyInter2的test3方法");
	}
}
class Inter1 {
	public void test2() {
		System.out.println("这个是父类的test2方法");
	}
}
class Inter2 extends Inter1 implements MyInter1, MyInter2 {
	@Override
	public void test3() {
		//MyInter2.super.test3();
		System.out.println("我自己重写的方法体");
	}
}

(三)static方法
1、JDK8接口中也可以定义静态方法
2、JDK8接口中不能定义抽象静态方法
3、JDK8接口中静态方法的调用格式:接口名.方法名

public class Demo02_StaticMethod {
	public static void main(String[] args) {
		MyInter3.test1();
	}
}
interface MyInter3 {
	public static void test1() {
		System.out.println("MyInter3接口的静态方法test1");
	}
}

二、Lambda表达式

(一)格式详解
1、是对匿名内部类的一个简化
2、在JDK8中提供了一个符号【->】叫做Lambda运算符,也叫作箭头符号,作用:分割Lambda表达式左右两部分内容
3、左边:参数列表
4、右边:方法的实现
5、语法格式一:无参数列表,无返回值,方法实现只有一句

MyInter4 fsn = () -> System.out.println("Lambda表达式实现了接口");
fsn.test1();

6、语法格式二:有一个参数,没有返回值,方法实现只有一句

MyInter5 ssn = x -> System.out.println(x);
ssn.test1(111);

7、语法格式三:有多个参数,没有返回值,方法实现只有一句

MyInter6 stn = (x, y, z) -> System.out.println(x + y + z);
stn.test1(12, "-", 5.0);

8、语法格式四:没有返回值,方法实现有多句

MyInter7 sfn = x -> {
	int result = x * x;
	System.out.println(result);
};
sfn.test1(10);

9、语法格式四:有返回值,方法实现有多句

MyInter8 sfn = x -> {
	int result = x * x;
	return result;
};
System.out.println(sfn.test1(9));

10、语法格式五:有返回值,方法实现有一句,并且是返回值语句

MyInter9 ssn = x -> x * x;
System.out.println(ssn.test1(8));

12、总结:
(1)当且仅当抽象方法的参数列表只有一个参数的时候,可以省略小括号,没有参数或者有多个参数不能省略小括号
(2)当且仅当方法体只有一句的时候,可以省略大括号,也可不省;如果为多句,方法体必须使用大括号包围起来,额外的,大括号后面的分号不能丢
(3)当且仅当方法体只有一句并且是返回值语句的时候,return语句必须用大括号包围起来;或者将return也省略掉,此时大括号必须省略

三、函数式接口

(一)概述
1、函数式接口:接口中有且仅有一个抽象方法的接口就是函数式接口,函数式接口中可以有多个非抽象方法
2、【Lambda表达式使用的前提:接口必须是函数式接口】
3、校验接口是否为一个函数式接口;使用注解【@Functionallnterface】严格按照函数式接口的语法判断接口是否是一个函数式接口
4、理解:
(1)函数:想表达的是一个方法的内容,即一个户口的名字和一个方法的实现一一应对,收到接口名称,就能唯一对应一个方法,而这个方法,在一个实现中,又只能对应到一个确定的方法体
(2)函数式接口:表示一个方法的声明能和唯一一个方法实现对应
5、作用:可以结合Lambda表达式将方法作为参数进行传递
6、好处:Lambda表达式,既是一个方法体,也是一个对象,我们可以直接通过Lambda表达式实现函数式接口,将Lambda表达式作为参数传递,就相当于将方法体作为参数进行传递
(二)常用内置函数式接口
1、说明:JDK8中提供了一些常用的函数式接口,在使用类似功能的时候,我们自己不用再去书写函数式接口了,而是直接通过Lambda表达式来实现这些接口就好
2、分类:
(1)Consumer:消费型接口 void accept(T t)
(2)Supplier:供给型接口 T get()
(3)Function(T, R):函数式接口 R apply(T t)
(4)Predicate:断言型接口 boolean test(T t)
(三)Consumer消费型接口
1、只消耗,即传入一个参数,将参数使用完毕就结束了,不会产生效果
2、抽象方法:void accept(T t)
3、作用:接受数据并且处理数据,处理完成后结束,没有返回值;结合Lambda表达式,我们可以实现将逻辑进行传递
(四)方法引用
1、写一个函数式接口的时候,方法体的实现需要我们自己定义。但是,当如果我们要写的这个方法的实现,已经在其他的地方写好了,我们就可以直接拿来使用,不用再自己书写了。
2、格式:
(1)非静态方法:对象名::方法名
(2)静态方法:类名::方法名
3、注意事项:当函数式接口的抽象方法参数列表、返回值类型,和要引用的方法的参数列表、返回值类
型一致的时候,就可以将别处定义的方法直接引用过来,如果不一样,就无法引用
4、本质:将一个在别处已经定义好的方法,在函数式接口的方法实现中调用了一下
(五)可变参数
1、参数个数可变的参数,例如:在Arrays类中方法asList(T… a),这里可以传入0到n个T类型的数据
2、可变参数本质上是一个数组
(六)Supplier供给型接口
1、只生产
2、抽象方法:T get()
(七)Function函数型接口
1、“进口加工再出口”
2、抽象方法:R apply(T t)
3、功能:andThen(Function fun) 将调用者的逻辑和参数逻辑合并,返回一个全新的Function对象,
具体先执行调用者逻辑,再执行参数逻辑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值