理解函數(shù)式接口以及 Lambda表達(dá)式的發(fā)展過(guò)程
任何接口,只包含唯一一個(gè)抽象方法,就是函數(shù)式接口
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
/** * lambdab表達(dá)式的發(fā)展 */ public class TestLambda1 { //3.靜態(tài)內(nèi)部類(lèi) static class Like2 implements ILike{ @Override public void lambda() { System.out.println( "i like lambda2" ); } } public static void main(String[] args) { ILike like= new Like(); like.lambda(); like= new Like2(); like.lambda(); //4.局部?jī)?nèi)部類(lèi) class Like3 implements ILike{ @Override public void lambda() { System.out.println( "i like lambda3" ); } } like= new Like3(); like.lambda(); //5.匿名內(nèi)部類(lèi) like= new ILike() { @Override public void lambda() { System.out.println( "i like lambda4" ); } }; like.lambda(); //6.用lambda簡(jiǎn)化 like=()->{ System.out.println( "i like lambda5" ); }; like.lambda(); } } //1.定義一個(gè)函數(shù)式接口 interface ILike{ void lambda(); } //2.實(shí)現(xiàn)類(lèi) class Like implements ILike{ @Override public void lambda() { System.out.println( "i like lambda" ); } } |
Lambda表達(dá)式及語(yǔ)法
Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// 1. 不需要參數(shù),返回值為 5 () -> 5 // 2. 接收一個(gè)參數(shù)(數(shù)字類(lèi)型),返回其2倍的值 x -> 2 * x // 3. 接受2個(gè)參數(shù)(數(shù)字),并返回他們的差值 (x, y) -> x – y // 4. 接收2個(gè)int型整數(shù),返回他們的和 ( int x, int y) -> x + y // 5. 接受一個(gè) string 對(duì)象,并在控制臺(tái)打印,不返回任何值(看起來(lái)像是返回void) (String s) -> System.out.print(s) |
也就是說(shuō),不需要事先聲明參數(shù)的類(lèi)型,圓括號(hào)可以沒(méi)有,大括號(hào)可以沒(méi)有,返回值可以沒(méi)有
一起來(lái)看看具體的使用
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
|
public class java8_Lambda_Test { public static final void main(String[] args) { Operator addOper = (a, b) -> a + b; Operator reduceOper = (a, b) -> a - b; Operator multiplyOper = (a, b) -> a * b; Operator DivideOper = (a, b) -> a / b; java8_Lambda_Test test = new java8_Lambda_Test(); System.out.println(test.getResult( 3 , 3 , addOper)); //6 System.out.println(test.getResult( 3 , 3 , reduceOper)); //0 System.out.println(test.getResult( 3 , 3 , multiplyOper)); //9 System.out.println(test.getResult( 3 , 3 , DivideOper)); //1 } public int getResult( int a, int b, Operator operator) { return operator.convert(a, b); } public interface Operator { int convert( int a, int b); default int get( int a) { return a; } } } |
你需要注意什么
1.lambda 表達(dá)式只能引用標(biāo)記了 final 的外層局部變量
2.可以直接在 lambda 表達(dá)式中訪問(wèn)外層的局部變量
Lambda的實(shí)際運(yùn)用
1.對(duì)集合排序
問(wèn)題描述:在一個(gè)存放了Student對(duì)象的list中,按年齡進(jìn)行排序,輸出排序后的list
Student類(lèi)
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
|
public class Student implements Comparable<Student>{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } @Override public int compareTo(Student student2) { int result = this .age - student2.age; return result; } } |
1
2
3
4
5
6
7
8
9
10
11
12
|
List<Student> list= new ArrayList<>(); Student s1= new Student(); s1.setName( "張三" ); s1.setAge( 28 ); list.add(s1); Student s= new Student(); s.setName( "李四" ); s.setAge( 22 ); list.add(s); sortUsingJava8(list); list.forEach((student) -> System.out.println(student.getName() + ":" +student.getAge())); |
1
2
3
4
|
// 使用 java 8 排序 static void sortUsingJava8(List<Student> list){ Collections.sort(list, (student1, student2) -> student1.compareTo(student2)); } |
來(lái)康康使用Java7進(jìn)行排序是這樣的:
1
2
3
4
5
6
7
8
9
|
// 使用 java 7 排序 private void sortUsingJava7(List<String> list){ Collections.sort(list, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.compareTo(s2); } }); } |
2.遍歷集合
1
2
3
4
5
6
7
8
9
10
11
12
|
//先準(zhǔn)備一個(gè)集合 List<Student> list= new ArrayList<>(); Student s1= new Student(); s1.setName( "張三" ); s1.setAge( 28 ); list.add(s1); Student s= new Student(); s.setName( "李四" ); s.setAge( 22 ); list.add(s); //使用 lambda 表達(dá)式以及函數(shù)操作(functional operation) list.forEach((student) -> System.out.println(student.getName() + ":" +student.getAge())); |
3.遍歷集合(帶條件)
1
2
3
4
5
|
//帶條件 打印年齡大于等于20的學(xué)生的姓名 list.forEach((student)->{ if (student.getAge()>= 20 ) System.out.println(student.getName()); }); |
4.代替 Runnable,開(kāi)啟一個(gè)線程
1
2
3
4
5
6
7
8
|
Runnable r = new Runnable() { @Override public void run() { //to do something } }; Thread t = new Thread(r); t.start(); |
現(xiàn)在這樣寫(xiě):
1
2
3
4
5
|
Runnable r = () -> { //to do something }; Thread t = new Thread(r); t.start(); |
你還可以這樣寫(xiě):
1
2
3
4
5
6
7
8
|
Thread t = new Thread(() -> { //to do something // such as for for ( int i = 0 ; i < 100 ; i++){ System.out.println(i); } }); t.start; |
到此這篇關(guān)于Java中Lambda表達(dá)式的使用詳解的文章就介紹到這了,更多相關(guān)Java Lambda內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/sxh06/article/details/120126810