Java 8 in Action 简记 1

(注:这篇简记为 follow Java 8 in Action 的记录,仅供个人阅读)

lambda

Java 的匿名类拥有自己的作用域,而 lambda 是词法作用域

Java 对于原始类型有单独的 Functional Interface

目标类型

流:“从支持数据操作的源生成的元素序列”

流只能被遍历一次

Stream.iterateStream.generate 用来生成无限流

匿名类并不能被直接转化为 lambda 表达式

尽量使用静态辅助方法,例如

1
menu.stream().map(Dish::getCalories).reduce(0, (c1, c2) -> c1 + c2);

就不如

1
menu.stream.collect(summingInt(Dish::getCalories));

默认方法

Java 8 允许在接口内声明静态方法,并引入了默认方法

解决默认方法可能带来的冲突:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface A {
void hello() {
System.out.println("Hello from A");
}
}
public interface B {
void hello() {
System.out.println("Hello from B");
}
}
public class C implements B, A { }
public class C implements B, A {
void hello(){
B.super.hello();
}
}

Optional

Optional 用来解决 null check 问题,例如:

1
2
3
4
5
6
7
8
9
10
11
12
public String getInsurance(Person person) {
if (person.getCar() != null) {
Car car = person.getCar();
if (car.getInsurance() != null) {
Insurance insurance = car.getInsurance();
if (insurance.getName() != null) {
return insurance.getName();
}
}
}
return "No insurance";
}

可以被 Optional 改写成:

1
2
3
public String getInsurance(Person person) {
return person.getCar().flatMap(Car::getInsurance).map(Insurance::getName).orElse("No insurance");
}

以及:

1
2
3
4
5
6
7
8
9
10
11
12
public int readDuration(Properties props, String name) {
String value = props.getProperty(name);
if (value != null) {
try {
int i = Integer.parseInt(value);
if (i > 0) {
return i;
}
} catch (NumberFormatException nfe) {}
}
return 0;
}

可被转化为:

1
2
3
4
5
6
public int readDuration(Properties props, String name) {
return Optional.ofNullable(props.getProperty(name))
.flatMap(Integers::tryParseInt)
.filter(i -> i > 0)
.orElse(0);
}

(未完待续)

(这篇简记为 follow Java 8 in Action 的记录,仅供个人阅读)