函数式接口
/*
Lambda表达式
() -> {}
Lambda表达式可以代替掉匿名内部类。
Lambda标准格式
(数据类型 变量名, 数据类型 变量名) -> {
方法体;
return 返回值;
}
Lambda表达式省略规则
1. 参数位置的数据类型可以省略。
2. 如果参数只有一个,那么可以省略小括号
3. 如果大括号内只有一条语句,那么可以省略大括号,return,以及分号
Lambda表示使用前提:
1. 接口中有且仅有一个需要被重写的抽象方法。
2. 必须支持上下文推倒。 要么把接口作为参数,要么用接口接收lambda表达式的结果。
可推导就是可省略
*/
public class Demo01Lambada {
public static void main(String[] args) {
//使用匿名内部类创建多线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行了");
}
}).start();
//使用lanbada表达式创建多线程
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "执行了");
}).start();
//使用lambada表达式的省略格式
new Thread(() -> System.out.println(Thread.currentThread().getName() + "执行了")).start();
}
}
例
import java.util.ArrayList;
import java.util.Collections;
public class Demo02Lambada {
public static void main(String[] args) {
//创建集合添加Person对象
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三庚", 18));
list.add(new Person("灭绝师太", 19));
list.add(new Person("赵丽颖", 18));
//使用比较器排序对集合中的Person对象按照年龄从小到大进行排序
/*
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});*/
//使用lambda表达式
Collections.sort(list, (o1, o2) -> o1.getAge() - o2.getAge());
System.out.println(list);
}
}
/*
请定义一个函数式接口 Eatable ,内含抽象 eat 方法,没有参数或返回值。使用该接口作为方法的参数,并进而
通过Lambda来使用它。
Lambda表达式是作为接口中抽象方法的内容存在的
*/
public class Demo01LambadaTest {
public static void method(Eatable eatable) {
eatable.eat();
}
public static void main(String[] args) {
//使用匿名内部类吃
method(new Eatable() {
@Override
public void eat() {
System.out.println("\"使用匿名内部类吃饭饭, 很难吃\"");
}
});
//使用lambada表达式吃
method(() -> {
System.out.println("使用lambada吃饭");
});
}
}
package cn.itcast.demo02函数式接口;
public interface Eatable {
void eat();
}
-------------------------------------------------------------------------------------------------------------
请定义一个函数式接口 Sumable ,内含抽象 sum 方法,可以将两个int数字相加返回int结果。使用该接口作为方法
的参数,并进而通过Lambda来使用它
*/
public class Demo02LambdaTest {
public static void main(String[] args) {
/* method(new Sumable() {
@Override
public int getSum(int a, int b) {
return a+b;
}
});*/
//使用lambada表达式改进
method((a, b) -> {
return a + b;
});
// 使用lambada表达式改进
method((a, b) -> a + b);
}
public static void method(Sumable sumable) {
int result = sumable.getSum(10, 20);
System.out.println(result);
}
}
package cn.itcast.demo02函数式接口;
public interface Sumable {
int getSum(int a,int b);
}
------------------------------------------------------------------------------------------------------------
/*
函数式接口
如果一个接口内有且仅有一个需要被重写的方法,那么这个接口就是一个函数式接口
函数式接口的作用:
1. 可以当做普通接口去使用 implements
2. 当做Lambda表达式的使用前提
有一个注解,可以验证一个接口是否是函数式接口。这个注解叫做FunctionalInterface
如果一个接口只有一个需要被重写的抽象方法,但是这个接口上面没有FunctionalInterface这个注解,这个
还是函数式接口
*/
public interface MyInterface {
void method();
}
public class Fu {
public void method() {
System.out.println("父类的方法");
}
}
public class Zi extends Fu{
@Override
public void method() {
super.method();
}
}