Skip to content

Commit e7b2d93

Browse files
java8的Optional
1 parent 9b1f6bd commit e7b2d93

File tree

6 files changed

+324
-61
lines changed

6 files changed

+324
-61
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.bean;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.Optional;
9+
10+
/**
11+
* @Author: EnjoyCoding
12+
* @Date: 2020\3\6 0006 23:31
13+
* @Description:
14+
*/
15+
16+
public class Address {
17+
private String country;
18+
private String province;
19+
private String city;
20+
21+
public Address(String country, String province, String city) {
22+
this.country = country;
23+
this.province = province;
24+
this.city = city;
25+
}
26+
27+
public Address() {
28+
}
29+
30+
public String getCountry() {
31+
return country;
32+
}
33+
34+
public void setCountry(String country) {
35+
this.country = country;
36+
}
37+
38+
public String getProvince() {
39+
return province;
40+
}
41+
42+
public void setProvince(String province) {
43+
this.province = province;
44+
}
45+
46+
public void setCity(String city) {
47+
this.city = city;
48+
}
49+
50+
public Optional<String> getCity() {
51+
return Optional.ofNullable(this.city);
52+
}
53+
}

src/main/java/com/bean/User.java

Lines changed: 53 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,60 @@
11
package com.bean;
22

3+
import java.util.Optional;
4+
35
/**
46
* Created by lenovo on 三月
57
*/
68
public class User {
7-
private String name;
8-
private String password;
9-
private String email;
10-
11-
public User() {
12-
}
13-
14-
public User(String name, String password, String email) {
15-
this.name = name;
16-
this.password = password;
17-
this.email = email;
18-
}
19-
20-
public String getName() {
21-
return name;
22-
}
23-
24-
public void setName(String name) {
25-
this.name = name;
26-
}
27-
28-
public String getPassword() {
29-
return password;
30-
}
31-
32-
public void setPassword(String password) {
33-
this.password = password;
34-
}
35-
36-
public String getEmail() {
37-
return email;
38-
}
39-
40-
public void setEmail(String email) {
41-
this.email = email;
42-
}
43-
44-
@Override
45-
public String toString() {
46-
return "User{" +
47-
"name='" + name + '\'' +
48-
", password='" + password + '\'' +
49-
", email='" + email + '\'' +
50-
'}';
51-
}
9+
private String name;
10+
private String password;
11+
private String email;
12+
private Address address;
13+
14+
public Optional<Address> getAddress() {
15+
return Optional.ofNullable(address);
16+
}
17+
18+
19+
public User() {
20+
}
21+
22+
public User(String name, String password, String email) {
23+
this.name = name;
24+
this.password = password;
25+
this.email = email;
26+
}
27+
28+
public String getName() {
29+
return name;
30+
}
31+
32+
public void setName(String name) {
33+
this.name = name;
34+
}
35+
36+
public String getPassword() {
37+
return password;
38+
}
39+
40+
public void setPassword(String password) {
41+
this.password = password;
42+
}
43+
44+
public String getEmail() {
45+
return email;
46+
}
47+
48+
public void setEmail(String email) {
49+
this.email = email;
50+
}
51+
52+
@Override
53+
public String toString() {
54+
return "User{" +
55+
"name='" + name + '\'' +
56+
", password='" + password + '\'' +
57+
", email='" + email + '\'' +
58+
'}';
59+
}
5260
}

src/main/java/com/bean/Worker.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.bean;
22

3+
import java.util.Optional;
4+
35
/**
46
* @Author: EnjoyCoding
57
* @Date: 2020\1\20 0020 20:42
@@ -12,12 +14,34 @@ public class Worker {
1214

1315
private String name;
1416

17+
private Address address;
18+
1519
public Worker(String id, Integer age, String name) {
1620
this.id = id;
1721
this.age = age;
1822
this.name = name;
1923
}
2024

25+
public Worker(String id, Integer age, String name, Address address) {
26+
this.id = id;
27+
this.age = age;
28+
this.name = name;
29+
this.address = address;
30+
}
31+
32+
/**
33+
* 重写getAdress()方法,返回Optional对象。
34+
* @return
35+
*/
36+
public Optional<Address> getAdress() {
37+
return Optional.ofNullable(this.address);
38+
}
39+
40+
41+
public void setAddress(Address address) {
42+
this.address = address;
43+
}
44+
2145
public String getId() {
2246
return id;
2347
}
@@ -41,4 +65,6 @@ public String getName() {
4165
public void setName(String name) {
4266
this.name = name;
4367
}
68+
69+
4470
}

src/main/java/com/java8/lambda/LambdaForeach2.java

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
package com.java8.optional;
2+
3+
import com.alibaba.fastjson.support.odps.udf.CodecCheck;
4+
import com.bean.Address;
5+
import com.bean.Worker;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.Optional;
10+
11+
/**
12+
* @Author: EnjoyCoding
13+
* @Date: 2020\3\5 0005 23:28
14+
* @Description:
15+
*/
16+
public class OptionalDemo {
17+
18+
/**
19+
* orElse(默认值),如果Optional<T>封装的对象不存在值,则返回默认值。
20+
*/
21+
public static void orElseDemo() {
22+
// Worker worker1=new Worker("123",18,"lin");
23+
Worker worker1 = null;
24+
Worker worker2 = new Worker("456", 28, "chen");
25+
//如果worker1不为null,则orElse返回worker1,否则返回默认值worker2
26+
Worker result = Optional.ofNullable(worker1).orElse(worker2);
27+
//相当于以下代码:
28+
// if (worker1 != null) {
29+
// result = worker1;
30+
// } else {
31+
// result = worker2;
32+
// }
33+
System.out.println(result.getName() + "," + result.getAge());
34+
}
35+
36+
/**
37+
* orElseGet(),如果Optional<T>封装的对象不存在值,则执行Supplier函数式。
38+
* orElseGet(Supplier<? extends T> other),返回的类型必须和Optional封装的对象类型一致。
39+
*/
40+
public static void ofElseGetDemo() {
41+
String name1 = null;
42+
String name2 = "lin";
43+
//orElseGet(Supplier<? extends T> other),返回的类型必须和Optional封装的对象类型一致。
44+
String result = Optional.ofNullable(name1).orElseGet(OptionalDemo::supplier);
45+
System.out.println(result);
46+
}
47+
48+
public static String supplier() {
49+
return "orElseGet(Supplier)";
50+
}
51+
52+
/**
53+
* of(对象),如果封装的对象为空,则会报出空指针异常
54+
*/
55+
public static void ofDemo() {
56+
// Worker worker1=new Worker("123",18,"lin");
57+
Worker worker1 = null;
58+
Worker worker2 = new Worker("456", 28, "chen");
59+
Worker result = Optional.of(worker1).orElse(worker2);
60+
System.out.println(result.getName() + "," + result.getAge());
61+
}
62+
63+
/**
64+
* isPresent()表示如果Optional<T>封装的对象不为空,就返回true。
65+
*/
66+
public static void isPresentDemo() {
67+
Worker worker1 = new Worker("123", 18, "lin");
68+
Optional<Worker> workerOpt = Optional.ofNullable(worker1);
69+
//这种写法比较丑,可以直接用下面的ifPresent()方法代替。
70+
boolean isPresent = workerOpt.isPresent();
71+
if (isPresent) {
72+
System.out.println(workerOpt.get().getName());
73+
}
74+
//以上代码,相当于:
75+
// if (worker1 != null) {
76+
// System.out.println(worker1.getName());
77+
// }
78+
}
79+
80+
/**
81+
* ifPresent()表示如果对象不为null,则会执行对应的lambda语句。
82+
*/
83+
public static void ifPresentDemo() {
84+
// Address address=new Address("中国","广东","深圳");
85+
// Worker worker1=new Worker("123",18,"lin",address);
86+
Worker worker1 = new Worker("123", 18, "lin");
87+
// Worker worker1=null;
88+
List<String> nameList = new ArrayList<>();
89+
Optional.ofNullable(worker1).ifPresent(worker -> nameList.add(worker.getName()));
90+
//上面这句代码的作用相当于以下注释的代码:
91+
// if (worker1 != null) {
92+
// nameList.add(worker1.getName());
93+
// }
94+
nameList.forEach(System.out::println);
95+
}
96+
97+
/**
98+
* 这种大量的判空代码很丑。
99+
*/
100+
public static void tooMuchNull(Worker worker) {
101+
// if (worker != null) {
102+
// Address address=worker.getAddress();
103+
// if (address != null) {
104+
// String city=address.getCity();
105+
// }
106+
// }
107+
}
108+
109+
110+
/**
111+
* flatMap(),如果Optional封装对象不为空,就会执行对应的mapping函数,返回Optional类型的值。
112+
* 否则就返回一个空的Optional对象。
113+
*/
114+
public static void flatMapDemo() {
115+
Address address = new Address("中国", "广东", "深圳");
116+
Worker worker = new Worker("123", 18, "lin", address);
117+
//默认值为"default",有没有更好的选择?
118+
String city = Optional.ofNullable(worker)
119+
.flatMap(Worker::getAdress)
120+
.flatMap(Address::getCity)
121+
.orElse("default");
122+
System.out.println(city);
123+
}
124+
125+
/**
126+
* orElseThrow(),如果Optional封装的对象为空,就会抛出对应的异常。
127+
*/
128+
public static void orElseThrowDemo() {
129+
// Worker worker = new Worker("123", 18, "lin");
130+
Worker worker = null;
131+
Worker result = Optional.ofNullable(worker)
132+
.orElseThrow(IllegalArgumentException::new);
133+
System.out.println(result.getName());
134+
}
135+
136+
137+
public static void filterDemo() {
138+
Worker worker = new Worker("123", 18, "lin");
139+
Optional<Worker> result = Optional.ofNullable(worker)
140+
.filter(worker1 -> worker1.getAge() > 20);
141+
//如果符合条件(比如,年龄大于20)则为true,不符合则为false
142+
System.out.println(result.isPresent());
143+
}
144+
145+
}

0 commit comments

Comments
 (0)