只有一个抽象方法的接口,可以用lambda
格式
(参数列表) -> {方法体}
(String msg) -> {System.out.println("mes = " + mes);}
匿名函数和lambda
匿名函数
interface Message {
void print(String mes);
}
// 使用匿名函数实现接口方法
public void testLambda() {
Message msg = new Message() {
@Override
public void print(String mes) {
System.out.println("mes = " + mes);
}
};
msg.print("hello");
}
lambda
interface Message {
void print(String mes);
}
// 使用匿名函数实现接口方法
public void testLambda() {
Message message = msg -> System.out.println("msg = " + msg);
message.print("hello");
}
格式省略
- 1.简化参数类型,可以不写参数类型,但是必须所有参数都不写
- 2.简化参数小括号,如果只有一个参数则可以省略参数小括号
- 3.简化方法体大括号,如果方法条只有一条语句,则可以胜率方法体大括号
- 4.简化return,如果只有一条return语句,则可以省略return
interface Message {
void print(String mes);
}
public int Operation(int a, int b, MathOperation mathOperation) {
return mathOperation.operation(a, b);
}
@Test
public void testLambda() {
//MathOperation addOperation = (int a, int b) -> {return a + b;};
MathOperation addOperation = (a, b) -> a + b;
System.out.println(Operation(10, 5, jianOperation));
}
@FunctionalInterface
标记接口类为一个函数式接口,要求接口中的抽象方法只有一个,排除多个default默认方法
Lambda创建线程
// Thread构造器接受Runnable接口
// 对Runnable接口重写run方法
Thread thread = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
}
});
thread.start();
Lambda集合操作
遍历
- list.forEach方法接受Consumer接口作为参数,Consumer接口中有方法void accept(T t),实现它即可
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5);
list.forEach((Integer element)->{
if (element % 2 == 0) {
System.out.println("element = " + element);
}
});
条件删除
- list.removeIf方法接受Predicate函数接口,Predicate接口实现boolean test(T t)即可
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5);
list.removeIf((Integer element) -> {
if (element % 2 == 0) {
return true;
}
return false;
});
System.out.println("list = " + list); //list = [1, 3, 5]
排序
- 同理,实现Comparator接口
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5);
list.sort((Integer i, Integer j)-> j - i);
System.out.println("list = " + list);
Lambda闭包问题
- Lambda使用非final变量会在编译器将该变量置为final变量,修改变量会编译报错
String str = "message: ";
Message msgplus = msg -> System.out.println(str + msg);
// str = "123"; //编译出错,被lambda引用的变量不可赋值