1.Java内置四大核心函数式接口:
2.函数型接口的小地方
3.函数型接口的静态方法
1.Java内置四大核心函数式接口:
函数式接口 | 参数类型 | 返回类型 | 用途 |
---|---|---|---|
Consumer 消费型接口 | T | void | 对类型为T的对象应用操作:void accept(T t) |
Supplier 提供型接口 | 无 | T | 返回类型为T的对象:T get() |
Function<T, R> 函数型接口 | T | R | 对类型为T的对象应用操作,并返回结果为R类型的对象:R apply(T t) |
Predicate 断言型接口 | T | boolean | 确定类型为T的对象是否满足某约束,并返回boolean值:boolean test(T t) |
1.1 消费型接口
@Test
public void test01(){
//Consumer
Consumer<Integer> consumer = (x) -> System.out.println("消费型接口" + x);
//test
consumer.accept(100);
}
1234567
1.2 提供型接口
@Test
public void test02(){
List<Integer> list = new ArrayList<>();
List<Integer> integers = Arrays.asList(1,2,3);
list.addAll(integers);
//Supplier<T>
Supplier<Integer> supplier = () -> (int)(Math.random() * 10);
list.add(supplier.get());
System.out.println(supplier);
for (Integer integer : list) {
System.out.println(integer);
}
}
12345678910111213
1.3 函数型接口
@Test
public void test03(){
//Function<T, R>
String oldStr = "abc123456xyz";
Function<String, String> function = (s) -> s.substring(1, s.length()-1);
//test
System.out.println(function.apply(oldStr));
}
12345678
1.4 断言型接口
@Test
public void test04(){
//Predicate<T>
Integer age = 35;
Predicate<Integer> predicate = (i) -> i >= 35;
if (predicate.test(age)){
System.out.println("你该退休了");
} else {
System.out.println("我觉得还OK啦");
}
}
2.函数型接口的小地方
2.1当父类方法与函数式接口方法重名时,调用那个方法
MyFun接口
public interface MyFun {
default String getName(){
return "我是MyFun接口";
}
}
MyClass类
public class MyClass {
public String getName(){
return "我是父类";
}
}
MyFun接口的实现类并且是MyClass类的子类
public class SubClass extends MyClass implements MyFun{
}
测试:
public class TestDefaultInterface {
public static void main(String[] args) {
SubClass sc = new SubClass();
System.out.println(sc.getName());
}
}
结果:
我是父类
#####很明显当父类方法与函数式接口方法重名时调用父类方法
2.2一个类实现多个函数式接口,有方法同名会怎样
MyFun接口
public interface MyFun {
default String getName(){
return "我是MyFun接口";
}
}
MyInterface接口
public interface MyInterface {
default String getName(){
return "我是MyInterface接口";
}
}
实现MyFun接口和 MyInterface接口的类
public class SubClass implements MyFun, MyInterface{
@Override
public String getName() {
return MyInterface.super.getName();
}
}
必须重写这个方法,重写可以选择实现任意一个接口。
3.函数型接口的静态方法
public interface MyInterface {
public static void show(){
System.out.println("接口中的静态方法");
}
}
public class TestDefaultInterface {
public static void main(String[] args) {
MyInterface.show();
}
}
结果:
接口中的静态方法