1
1
##Lambda表达式
2
+
2
3
- ** Lambda表达式的使用**
3
4
4
- java8以前的字符串排列,创建一个匿名的比较器对象Comparator然后将其传递给sort方法
5
- ```
6
- List<String> names= Arrays.asList("peter", "anna", "mike", "xenia");
7
- Collections.sort(names, new Comparator<String>() {
8
- @Override
9
- public int compare(String a, String b) {
10
- return b.compareTo(a);
11
- }
12
- });
13
- ```
14
- java8使用lambda表达式就不需要匿名对象了
15
- ```
16
- Collections.sort(names,(String a,String b)->{return b.compareTo(a);});
17
- ```
18
- 简化一下:对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字
19
- ```
20
- Collections.sort(names,(String a,String b)->b.compareTo(a));
21
- ```
22
- Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型
23
- ````
24
- Collections.sort(names, (a, b) -> b.compareTo(a));
25
- ````
26
- ```
27
- ##:[xenia, peter, mike, anna]
28
- ```
29
- 对于null的处理
30
- ```
31
- List<String> names2 = Arrays.asList("peter", null, "anna", "mike", "xenia");
32
- names2.sort(Comparator.nullsLast(String::compareTo));
33
- System.out.println(names2);
34
- ##:[anna, mike, peter, xenia, null]
35
- ```
5
+ java8以前的字符串排列,可以创建一个匿名的比较器对象Comparator然后将其传递给sort方法:
6
+
7
+ ```
8
+ List<String> names= Arrays.asList("peter", "anna", "mike", "xenia");
9
+ Collections.sort(names, new Comparator<String>() {
10
+ @Override
11
+ public int compare(String a, String b) {
12
+ return b.compareTo(a);
13
+ }
14
+ });
15
+ ```
16
+
17
+ java8使用lambda表达式就不需要匿名对象了:
18
+
19
+ ```
20
+ Collections.sort(names,(String a,String b)->{return b.compareTo(a);});
21
+ ```
22
+
23
+ 还可以简化一下:对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字:
24
+
25
+ ```
26
+ Collections.sort(names,(String a,String b)->b.compareTo(a));
27
+ ```
28
+
29
+ Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型:
30
+
31
+ ````
32
+ Collections.sort(names, (a, b) -> b.compareTo(a));
33
+ ````
34
+
35
+ 结果如下:
36
+ ```
37
+ ##:[xenia, peter, mike, anna]
38
+ ```
39
+
40
+ 对于null的处理:
41
+
42
+ ```
43
+ List<String> names2 = Arrays.asList("peter", null, "anna", "mike", "xenia");
44
+ names2.sort(Comparator.nullsLast(String::compareTo));
45
+ System.out.println(names2);
46
+ ##:[anna, mike, peter, xenia, null]
47
+ ```
36
48
- **函数式接口,方法,构造器**
37
49
38
- 每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,
39
- 每一个该类型的lambda表达式都会被匹配到这个抽象方法。
40
- 因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
41
- 我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,
42
- 编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
43
50
44
- ####函数式接口
51
+ ####函数式-接口
45
52
46
- ```
47
- @FunctionalInterface
48
- public static interface Converter<F, T> {
49
- T convert(F from);
50
- }
51
- /**原始的接口实现*/
52
- Converter<String, Integer> integerConverter1 = new Converter<String, Integer>() {
53
- @Override
54
- public Integer convert(String from) {
55
- return Integer.valueOf(from);
53
+
54
+ 每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,
55
+ 每一个该类型的lambda表达式都会被匹配到这个抽象方法。
56
+ 因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
57
+ 我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,
58
+ 你只需要给你的接口添加 @FunctionalInterface 注解,
59
+ 编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
60
+
61
+ ```
62
+ @FunctionalInterface
63
+ public static interface Converter<F, T> {
64
+ T convert(F from);
56
65
}
57
- };
58
-
59
- /**使用lambda表达式实现接口*/
60
- Converter<String, Integer> integerConverter2 = (from) -> Integer.valueOf(from);
61
-
62
- Integer converted1 = integerConverter1.convert("123");
63
- Integer converted2 = integerConverter2.convert("123");
64
- System.out.println(converted1);
65
- System.out.println(converted2);
66
- ##:123
67
- 123
68
- /**简写的lambda表达式*/
69
- Converter<String, Integer> integerConverter3 = Integer::valueOf;
70
- Integer converted3 = integerConverter3.convert("123");
71
- System.out.println(converted3);
72
- ##:123
73
- ```
74
- ####函数式方法
75
- ```
76
- static class Something {
77
- String startsWith(String s) {
78
- return String.valueOf(s.charAt(0));
66
+ /**原始的接口实现*/
67
+ Converter<String, Integer> integerConverter1 = new Converter<String, Integer>() {
68
+ @Override
69
+ public Integer convert(String from) {
70
+ return Integer.valueOf(from);
71
+ }
72
+ };
73
+
74
+ /**使用lambda表达式实现接口*/
75
+ Converter<String, Integer> integerConverter2 = (from) -> Integer.valueOf(from);
76
+
77
+ Integer converted1 = integerConverter1.convert("123");
78
+ Integer converted2 = integerConverter2.convert("123");
79
+ System.out.println(converted1);
80
+ System.out.println(converted2);
81
+ ##:123
82
+ 123
83
+ /**简写的lambda表达式*/
84
+ Converter<String, Integer> integerConverter3 = Integer::valueOf;
85
+ Integer converted3 = integerConverter3.convert("123");
86
+ System.out.println(converted3);
87
+ ##:123
88
+ ```
89
+
90
+ ####函数式-方法
91
+
92
+ ```
93
+ static class Something {
94
+ String startsWith(String s) {
95
+ return String.valueOf(s.charAt(0));
96
+ }
79
97
}
80
- }
81
- Something something = new Something() ;
82
- Converter<String, String> stringConverter = something::startsWith ;
83
- String converted4 = stringConverter.convert("Java" );
84
- System.out.println(converted4);
85
- ##:j
86
- ```
87
- ####函数式构造器
88
- Java编译器会自动根据PersonFactory.create方法的签名来选择合适的构造函数。
89
- ```
98
+ Something something = new Something();
99
+ Converter<String, String> stringConverter = something::startsWith ;
100
+ String converted4 = stringConverter.convert("Java") ;
101
+ System.out.println(converted4 );
102
+ ##:j
103
+ ```
104
+ ####函数式-构造器
105
+ Java编译器会自动根据PersonFactory.create方法的签名来选择合适的构造函数。
106
+
107
+ ```
90
108
public class Person {
91
109
public String firstName;
92
110
public String lastName;
@@ -103,28 +121,33 @@ Java编译器会自动根据PersonFactory.create方法的签名来选择合适
103
121
return firstName+lastName;
104
122
}
105
123
}
106
- ```
107
- ```
124
+ ```
125
+
126
+ ```
108
127
interface PersonFactory<P extends Person > {
109
128
P create(String firstName, String lastName);
110
129
}
111
130
PersonFactory<Person > personFactory = Person::new;
112
131
Person person = personFactory.create("xu", "hua");
113
132
System.out.println(person.toString());
114
133
##: xuhua
115
- ```
134
+ ```
135
+
116
136
- **Lambda作用域**
117
137
118
- 在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。
119
- 你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
120
- ```
138
+ 在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。
139
+ 你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
140
+
141
+ ```
142
+
121
143
static int outerStaticNum = 10;
122
144
123
145
int outerNum;
124
146
125
147
void testScopes() {
126
148
127
149
/** 变量num可以不用声明为final* /
150
+ /** 但是num必须不可被后面的代码修改(即隐性的具有final的语义),否则编译出错* /
128
151
int num = 1;
129
152
130
153
/**可以直接在lambda表达式中访问外层的局部变量*/
@@ -133,7 +156,6 @@ Java编译器会自动根据PersonFactory.create方法的签名来选择合适
133
156
String convert = stringConverter.convert(2);
134
157
System.out.println(convert);
135
158
##:13
136
- /**但是num必须不可被后面的代码修改(即隐性的具有final的语义),否则编译出错*/
137
159
//num=3;
138
160
139
161
/**lambda内部对于实例的字段以及静态变量是即可读又可写*/
@@ -160,4 +182,4 @@ Java编译器会自动根据PersonFactory.create方法的签名来选择合适
160
182
##:Before:array[0]-->Hi here
161
183
After:array[0]-->Hi there
162
184
}
163
- ```
185
+ ```
0 commit comments