Skip to content

Commit 3aebc21

Browse files
committed
lambda
1 parent 8571c7c commit 3aebc21

File tree

1 file changed

+110
-88
lines changed

1 file changed

+110
-88
lines changed
Lines changed: 110 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,110 @@
11
##Lambda表达式
2+
23
- **Lambda表达式的使用**
34

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+
```
3648
- **函数式接口,方法,构造器**
3749
38-
每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,
39-
每一个该类型的lambda表达式都会被匹配到这个抽象方法。
40-
因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
41-
我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,
42-
编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
4350
44-
####函数式接口
51+
####函数式-接口
4552
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);
5665
}
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+
}
7997
}
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+
```
90108
public class Person {
91109
public String firstName;
92110
public String lastName;
@@ -103,28 +121,33 @@ Java编译器会自动根据PersonFactory.create方法的签名来选择合适
103121
return firstName+lastName;
104122
}
105123
}
106-
```
107-
```
124+
```
125+
126+
```
108127
interface PersonFactory<P extends Person> {
109128
P create(String firstName, String lastName);
110129
}
111130
PersonFactory<Person> personFactory = Person::new;
112131
Person person = personFactory.create("xu", "hua");
113132
System.out.println(person.toString());
114133
##:xuhua
115-
```
134+
```
135+
116136
- **Lambda作用域**
117137
118-
在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。
119-
你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
120-
```
138+
在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。
139+
你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
140+
141+
```
142+
121143
static int outerStaticNum = 10;
122144

123145
int outerNum;
124146

125147
void testScopes() {
126148

127149
/**变量num可以不用声明为final*/
150+
/**但是num必须不可被后面的代码修改(即隐性的具有final的语义),否则编译出错*/
128151
int num = 1;
129152

130153
/**可以直接在lambda表达式中访问外层的局部变量*/
@@ -133,7 +156,6 @@ Java编译器会自动根据PersonFactory.create方法的签名来选择合适
133156
String convert = stringConverter.convert(2);
134157
System.out.println(convert);
135158
##:13
136-
/**但是num必须不可被后面的代码修改(即隐性的具有final的语义),否则编译出错*/
137159
//num=3;
138160

139161
/**lambda内部对于实例的字段以及静态变量是即可读又可写*/
@@ -160,4 +182,4 @@ Java编译器会自动根据PersonFactory.create方法的签名来选择合适
160182
##:Before:array[0]-->Hi here
161183
After:array[0]-->Hi there
162184
}
163-
```
185+
```

0 commit comments

Comments
 (0)