1.接口相关
JDK8中接口中
1.可以写普通方法,使用default关键字修饰,在返回值之前,访问修饰符之后
2.可以写静态方法,直接使用接口名调用即可
2.Lambda表达式
Lambda表达式
1.固定格式: ()->
2.用于简化匿名内部类的书写格式
3.使用lambda表达式要求:必须是只有一个抽象方法的接口
4.小括号中的形参可以不写类型,直接写名字
5.单行语句的情况下,不能加return,多行必须加return
6.@FunctionalInterface注解用于检测函数式接口的书写格式
2.1代码演示
package com.qfedu.test1;
/**
* Lambda表达式相当于匿名内部类的简化版
* 1. ()-> 固定格式
* 2. 使用lambda表达式的接口必须是函数式接口 也就是 说只能有一个抽象方法
* 3.Lambda表达式仅适用于函数式接口 不能用在抽象类中
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
A a1 = new A() {
@Override
public void m1() {
System.out.println("hello ");
}
};
a1.m1();
A a2 = ()-> System.out.println("hello");
a2.m1();
B b1 = (numa)-> System.out.println(numa);
b1.m1(20);
C c1 = (numb)-> numb;
System.out.println(c1.m1(33));
D d1 = (numc,str)->{
System.out.println(str);
return 20;
};
d1.m1(20, "hello world");
}
}
@FunctionalInterface
interface A{
void m1();
// void m2();
}
interface B{
void m1(int a);
}
interface C{
int m1(int a);
}
interface D{
int m1(int a,String s);
}
3.方法引用
方法引用表示我们使用lambda表达式语法可以引用一些已经书写好的方法体,前提是我们定义好与被引用方法返回值和形参一致的函数式接口即可。
3.1代码演示
package com.qfedu.test1;
/**
* 方法引用
* 1.构造方法引用
* 2.普通方法引用
* 3.静态方法引用
* @author WHD
*
*/
public class Test2 {
public static void main(String[] args) {
A1 a1 = Student :: new; // 构造方法引用
a1.m1(); // 接口中参数的个数决定了具体调用哪个构造方法 没有参数就调无参构造
B1 b1 = Student :: new;
b1.m1("a", 20); // 将调用构造方法为 两个参数 且第一个为String 第二个 为 int
// String 类中的 startsWith
String str = "abcd";
// System.out.println(str.startsWith("a"));
C1<Boolean,String> c1 = str :: startsWith; // 普通方法引用
System.out.println(c1.test("a"));
D1 d1 = System.out :: print; // 普通方法引用 需要先有对象 才冒号 方法名
d1.test("hello world");
System.out.println(String.valueOf(true).length());
F1<String,Boolean> f1 = String :: valueOf; // 静态方法引用 直接类型 加上两个 冒号
System.out.println(f1.test(false).length());
}
}
interface F1<R,P>{
R test(P p);
}
interface D1{
void test(Object obj);
}
interface C1<R,P>{
R test(P p);
}
class Student{
private String name;
private int age;
public Student(String name, int age) {
System.out.println("Student类有参构造方法");
this.name = name;
this.age = age;
}
public Student() {
System.out.println("Student类无参构造方法");
}
}
interface A1{
void m1();
}
interface B1{
void m1(String a,int b);
}
4. JDK提供的函数式接口
JDK提供的函数式接口,都位于java.util.function这个包下
1.功能型接口 有参数 有返回值 用于实现一些功能
2.消费型接口 只有参数 没有返回值
3.供给型接口 只有返回值 没有参数
4.断言型接口 返回值都为布尔类型
4.1代码演示
package com.qfedu.test1;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* JDK提供的函数式接口
* 1.功能型接口 有参数 有返回值 用于实现一些功能
* 2.消费型接口 只有参数 没有返回值
* 3.供给型接口 只有返回值 没有参数
* 4.断言型接口 返回值都为布尔类型
* @author WHD
*
*/
public class Test3 {
public static void main(String[] args) {
// 功能型 Function
Function<Integer,String> fun = String :: valueOf;
System.out.println(fun.apply(2320));
// 消费型 Consumer
Consumer<String> con = System.out :: println;
con.accept("hello world");
// 供给型 Supplier
String str = "abcd";
Supplier<Integer> su = str :: length;
System.out.println(su.get());
// 断言型 Predicate
Predicate<String> pre = str :: startsWith;
System.out.println(pre.test("A"));
}
}