Lambda表达式介绍
Lambda表达式是JAVA8中最重要的新功能之一。使用它可以代替只有一个抽象函数的接口(函数式接口)实现,告别匿名内部类,简化代码。Lambda表达式同时还提升了对集合、框架的迭代、遍历等操作。
特点:
- 函数式编程
- 参数类型自动推断
- 代码量少比较简洁
Lambda表达式使用
(object...atgs)->{函数式接口抽象方法实现逻辑}
- ()参数是一个的时候,括号可以省略
- 当expr逻辑非常简单时,{}和return可以省略
- ()中可以写类型也可以不写,它可以自行进行类型推断(最好带着)
()->{return 100;}
()->100
(int x)->{return x+1;}
x->x+1
告别匿名内部类,简化代码
1 | // 按照字符串长度从小到大排序 |
函数式接口
只有一个抽象方法的接口交叫做函数式接口。
在接口前加上@FunctionalInterface
注解,如果定义了两个接口会报错。e.g Runnable接口是一个函数式接口。
常用的函数式接口
1 | /** |
结果:
在main方法外定义三个函数:
1 | static int get() { |
对方法进行基本调用:
1 | /** |
再加一个自定义函数式接口
1 |
|
对该接口方法进行调用:
1 | LambdaInterface li1 = () -> get(); // 调用的是staitc int get() |
方法的引用
也是Lambda表达式的一种使用方式。用来直接访问最终让方法的调用变得非常简单。
方法引用发分类
静态方法的引用
1
2
3
4
5
6
7
8
9public static void getSize(int size) {
System.out.println(size);
}
public static void main(String[] args) {
Consumer<Integer> c1 = Test2::getSize;
c1.accept(123);
Consumer<Integer> c2 = (size) -> Test2.getSize(size);
c1.accept(123);
}结果:
123
123实例方法的引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14public String put() {
return "put..";
}
public static void main(String[] args) {
System.out.println(new Test3().put());
Supplier<String> s1 = () -> new Test3().put();
Supplier<String> s2 = () -> {return new Test3().put();};
Supplier<String> s3 = new Test3()::put;
System.out.println(s1.get());
System.out.println(s2.get());
System.out.println(s3.get());
// System.out是标准输出流,是个PrintStream类对象。即调用println()普通方法
// System.out::println
}结果:
AAA
AAA
AAA
AAA对象方法的引用(用的少)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36public class Test4 {
public static void main(String[] args) {
Consumer<Too> c1 = (Too too)->new Too().foo();
c1.accept(new Too());
// Consumer<Too2> c2 = (Too too) -> new Too2().foo(); // 报错
Consumer<Too> c2 = (Too too) -> new Too2().foo();
c2.accept(new Too());
Consumer<Too> c3 = Too::foo;
c3.accept(new Too());
BiConsumer<Too2,String> bc = (too2,str)->new Too2().show(str);
BiConsumer<Too2,String> bc2 = Too2::show;
bc.accept(new Too2(),"abc");
bc.accept(new Too2(),"def");
}
}
class Too{
public Integer fun(String s) {
return 1;
}
public void foo() {
System.out.println("foo");
}
}
class Too2{
public Integer fun(String s) {
return 1;
}
public void foo() {
System.out.println("foo---too2");
}
public void show(String str) {
System.out.println("show---too2--"+str);
}
}结果:
foo
foo—too2
foo
show—too2–abc
show—too2–def构造方法的引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34public static void main(String[] args) {
Supplier<Account> s1 = ()->new Account();
s1.get();
Supplier<Account> s2 = Account::new;
s2.get();
Supplier<List> s3 = ArrayList::new;
Supplier<Set> s4 = HashSet::new;
Supplier<Thread> s5 = Thread::new;
Supplier<String> s6 = String::new;
// Supplier<Integer> s7 = Integer::new; // 错误,没有无参构造方法
Consumer<Integer> c1 = (age) -> new Account(age);
Consumer<Integer> c2 = Account::new;
c1.accept(123);
c2.accept(234);
Function<String,Account> f1 = (str)->new Account(str);
Function<String,Account> f2 = Account::new;
f1.apply("abc");
f2.apply("bcd");
}
}
class Account {
public Account(int age) {
System.out.println("age 参数构造"+age);
}
public Account(String s) {
System.out.println("s 参数构造"+s);
}
public Account() {
System.out.println("调用无参构造方法");
}
}结果:
调用无参构造方法
调用无参构造方法
age 参数构造123
age 参数构造234
s 参数构造abc
s 参数构造bcd