Skip to content

Commit dae9e1f

Browse files
committed
[add] add Optional examples in Java 8 module.
1 parent 0529ac2 commit dae9e1f

File tree

14 files changed

+275
-29
lines changed

14 files changed

+275
-29
lines changed

java8/README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,13 @@
5454
- ChainOfResponsibilityMain: 责任链模式
5555
- FactoryMain: 工厂模式
5656
- Debugging: 查看栈跟踪
57-
- Peek: 使用日志调试
57+
- Peek: 使用日志调试
58+
- Ambiguous: 默认方法解决冲突
59+
60+
61+
Optional
62+
63+
- Car,Insurance,Person: 模型类
64+
- OptionalMain: ptional 用法(map,flatMap,filter)
65+
- OptionalInAction: 使用 Optional 实战示例
66+
- ReadPositiveIntParam: 使用 Optional 示例

java8/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,11 @@
1111

1212
<artifactId>java8</artifactId>
1313

14+
<dependencies>
15+
<dependency>
16+
<groupId>junit</groupId>
17+
<artifactId>junit</artifactId>
18+
</dependency>
19+
</dependencies>
20+
1421
</project>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.brianway.learning.java8.effective;
2+
3+
/**
4+
* 默认方法解决冲突
5+
*/
6+
public class Ambiguous {
7+
8+
public static void main(String... args) {
9+
new C().hello();
10+
}
11+
12+
interface A {
13+
default void hello() {
14+
System.out.println("Hello from A");
15+
}
16+
}
17+
18+
interface B {
19+
default void hello() {
20+
System.out.println("Hello from B");
21+
}
22+
}
23+
24+
static class C implements B, A {
25+
public void hello() {
26+
A.super.hello();// Java 8 引入的新语法: X.super.m(...)
27+
// 其中 X 为希望调用 m 方法所在的父接口
28+
}
29+
}
30+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.brianway.learning.java8.effective.optional;
2+
3+
import java.util.Optional;
4+
5+
public class Car {
6+
7+
private Optional<Insurance> insurance;
8+
9+
public Optional<Insurance> getInsurance() {
10+
return insurance;
11+
}
12+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.brianway.learning.java8.effective.optional;
2+
3+
public class Insurance {
4+
5+
private String name;
6+
7+
public String getName() {
8+
return name;
9+
}
10+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.brianway.learning.java8.effective.optional;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Optional;
6+
7+
/**
8+
* Created by brian on 17/3/27.
9+
* 使用 Optional 实战示例
10+
*/
11+
public class OptionalInAction {
12+
13+
private static Map<String, Object> map = new HashMap<>();
14+
15+
public static void main(String[] args) {
16+
Optional<Object> value = getValue("key");
17+
System.out.println(value.orElse("this is null"));
18+
19+
System.out.println(stringToInt("123"));
20+
System.out.println(stringToInt("dd"));
21+
22+
}
23+
24+
/**
25+
* 用 Optional 封装可能为 null 的值
26+
*/
27+
public static Optional<Object> getValue(String key) {
28+
Optional<Object> value = Optional.ofNullable(map.get(key));
29+
return value;
30+
}
31+
32+
/**
33+
* 异常与 Optional 的对比
34+
*/
35+
public static Optional<Integer> stringToInt(String s) {
36+
try {
37+
return Optional.of(Integer.parseInt(s));
38+
} catch (NumberFormatException e) {
39+
return Optional.empty();
40+
}
41+
}
42+
43+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.brianway.learning.java8.effective.optional;
2+
3+
import java.util.Optional;
4+
5+
/**
6+
* Optional 用法:
7+
* - 使用 map 从 Optional 对象提取和转换值
8+
* - 使用 flatMap 链接 Optional 对象
9+
* - 两个 Optional 对象的组合
10+
* - 使用 filter 剔除特定值
11+
*/
12+
public class OptionalMain {
13+
14+
public static void main(String[] args) {
15+
Optional<Person> person = Optional.of(new Person());
16+
//Optional<Person> person2 = Optional.empty();
17+
String name = getCarInsuranceName(person);
18+
System.out.println(name);
19+
}
20+
21+
public static String getCarInsuranceName(Optional<Person> person) {
22+
return person.flatMap(Person::getCar)
23+
.flatMap(Car::getInsurance)
24+
.map(Insurance::getName)
25+
.orElse("Unknown");
26+
}
27+
28+
public Insurance findCheapestInsurance(Person person, Car car) {
29+
//省略业务逻辑
30+
Insurance cheapestCompany = new Insurance();
31+
return cheapestCompany;
32+
}
33+
34+
public Optional<Insurance> nullSafeFindCheapestInsurance(Optional<Person> person, Optional<Car> car) {
35+
return person.flatMap(
36+
p -> car.map(
37+
c -> findCheapestInsurance(p, c)));
38+
}
39+
40+
public void PrintIfWithName(String name) {
41+
Optional<Insurance> optInsurance = Optional.of(new Insurance());
42+
optInsurance.filter(insurance -> name.equals(insurance.getName()))
43+
.ifPresent(x -> System.out.println("ok"));
44+
}
45+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.brianway.learning.java8.effective.optional;
2+
3+
import java.util.Optional;
4+
5+
public class Person {
6+
7+
private Car car;
8+
9+
public Optional<Car> getCar() {
10+
return Optional.ofNullable(car);
11+
}
12+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.brianway.learning.java8.effective.optional;
2+
3+
import static java.util.Optional.empty;
4+
import static java.util.Optional.of;
5+
import static java.util.Optional.ofNullable;
6+
7+
import java.util.Optional;
8+
import java.util.Properties;
9+
10+
/**
11+
* 使用 Optional 示例
12+
* test case 见 test 目录
13+
*/
14+
public class ReadPositiveIntParam {
15+
16+
public static int readDurationImperative(Properties props, String name) {
17+
String value = props.getProperty(name);
18+
if (value != null) {
19+
try {
20+
int i = Integer.parseInt(value);
21+
if (i > 0) {
22+
return i;
23+
}
24+
} catch (NumberFormatException nfe) {
25+
}
26+
}
27+
return 0;
28+
}
29+
30+
public static int readDurationWithOptional(Properties props, String name) {
31+
return ofNullable(props.getProperty(name))
32+
.flatMap(ReadPositiveIntParam::s2i)
33+
.filter(i -> i > 0).orElse(0);
34+
}
35+
36+
public static Optional<Integer> s2i(String s) {
37+
try {
38+
return of(Integer.parseInt(s));
39+
} catch (NumberFormatException e) {
40+
return empty();
41+
}
42+
}
43+
44+
}

java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public static void main(String[] args) {
3434
/**
3535
* 根据抽象条件筛选
3636
* 将迭代集合的逻辑和要应用到集合中每个元素的行为区分开
37+
*
3738
* @param inventory
3839
* @param p
3940
* @return

0 commit comments

Comments
 (0)