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

java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public static void main(String[] args) {
1515
List<Integer> twoEvenSquares =
1616
numbers.stream()
1717
.filter(n -> {
18-
System.out.println("filtering " + n); return n % 2 == 0;
18+
System.out.println("filtering " + n);
19+
return n % 2 == 0;
1920
})
2021
.map(n -> {
2122
System.out.println("mapping " + n);

java8/src/main/java/com/brianway/learning/java8/streamapi/usage/Filtering.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,38 @@
1616
*/
1717
public class Filtering {
1818

19-
public static void main(String...args){
19+
public static void main(String... args) {
2020

2121
// Filtering with predicate
2222
List<Dish> vegetarianMenu =
23-
menu.stream()
24-
.filter(Dish::isVegetarian)
25-
.collect(toList());
23+
menu.stream()
24+
.filter(Dish::isVegetarian)
25+
.collect(toList());
2626

2727
vegetarianMenu.forEach(System.out::println);
2828

2929
// Filtering unique elements
3030
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
3131
numbers.stream()
32-
.filter(i -> i % 2 == 0)
33-
.distinct()
34-
.forEach(System.out::println);
32+
.filter(i -> i % 2 == 0)
33+
.distinct()
34+
.forEach(System.out::println);
3535

3636
// Truncating a stream
3737
List<Dish> dishesLimit3 =
38-
menu.stream()
39-
.filter(d -> d.getCalories() > 300)
40-
.limit(3)
41-
.collect(toList());
38+
menu.stream()
39+
.filter(d -> d.getCalories() > 300)
40+
.limit(3)
41+
.collect(toList());
4242

4343
dishesLimit3.forEach(System.out::println);
4444

4545
// Skipping elements
4646
List<Dish> dishesSkip2 =
47-
menu.stream()
48-
.filter(d -> d.getCalories() > 300)
49-
.skip(2)
50-
.collect(toList());
47+
menu.stream()
48+
.filter(d -> d.getCalories() > 300)
49+
.skip(2)
50+
.collect(toList());
5151

5252
dishesSkip2.forEach(System.out::println);
5353
}

java8/src/main/java/com/brianway/learning/java8/streamapi/usage/Finding.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,32 @@
1010
*/
1111
public class Finding {
1212

13-
public static void main(String...args){
14-
if(isVegetarianFriendlyMenu()){
13+
public static void main(String... args) {
14+
if (isVegetarianFriendlyMenu()) {
1515
System.out.println("Vegetarian friendly");
1616
}
1717

1818
System.out.println(isHealthyMenu());
1919
System.out.println(isHealthyMenu2());
20-
20+
2121
Optional<Dish> dish = findVegetarianDish();
2222
dish.ifPresent(d -> System.out.println(d.getName()));
2323
}
24-
25-
private static boolean isVegetarianFriendlyMenu(){
24+
25+
private static boolean isVegetarianFriendlyMenu() {
2626
return menu.stream().anyMatch(Dish::isVegetarian);
2727
}
28-
29-
private static boolean isHealthyMenu(){
28+
29+
private static boolean isHealthyMenu() {
3030
return menu.stream().allMatch(d -> d.getCalories() < 1000);
3131
}
32-
33-
private static boolean isHealthyMenu2(){
32+
33+
private static boolean isHealthyMenu2() {
3434
return menu.stream().noneMatch(d -> d.getCalories() >= 1000);
3535
}
36-
37-
private static Optional<Dish> findVegetarianDish(){
36+
37+
private static Optional<Dish> findVegetarianDish() {
3838
return menu.stream().filter(Dish::isVegetarian).findAny();
3939
}
40-
40+
4141
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.brianway.learning.java8.effective.optional;
2+
3+
import static com.brianway.learning.java8.effective.optional.ReadPositiveIntParam.readDurationImperative;
4+
import static com.brianway.learning.java8.effective.optional.ReadPositiveIntParam.readDurationWithOptional;
5+
import static junit.framework.TestCase.assertEquals;
6+
import org.junit.Test;
7+
8+
import java.util.Properties;
9+
10+
/**
11+
* Created by brian on 17/3/27.
12+
*/
13+
public class ReadPositiveIntParamTest {
14+
@Test
15+
public void testMap() {
16+
Properties props = new Properties();
17+
props.setProperty("a", "5");
18+
props.setProperty("b", "true");
19+
props.setProperty("c", "-3");
20+
21+
assertEquals(5, readDurationImperative(props, "a"));
22+
assertEquals(0, readDurationImperative(props, "b"));
23+
assertEquals(0, readDurationImperative(props, "c"));
24+
assertEquals(0, readDurationImperative(props, "d"));
25+
26+
assertEquals(5, readDurationWithOptional(props, "a"));
27+
assertEquals(0, readDurationWithOptional(props, "b"));
28+
assertEquals(0, readDurationWithOptional(props, "c"));
29+
assertEquals(0, readDurationWithOptional(props, "d"));
30+
}
31+
32+
}

0 commit comments

Comments
 (0)