Java8
分享 Java8 的新特性。

行为参数化(函数式接口)

  1. 1.
    筛选某种颜色的苹果
  2. 2.
    筛选重量大于某个值的苹果
Java8 之前的代码
1
public class Apple {
2
3
public static List<Apple> filterApplesByColor(List<Apple> inventory, String color) {
4
List<Apple> result = new ArrayList<Apple>();
5
for (Apple apple: inventory){
6
if ( apple.getColor().equals(color) ) {
7
result.add(apple);
8
}
9
}
10
return result;
11
}
12
13
public static List<Apple> filterApplesByWeight(List<Apple> inventory, int weight) {
14
List<Apple> result = new ArrayList<Apple>();
15
for (Apple apple: inventory){
16
if ( apple.getWeight() > weight ){
17
result.add(apple);
18
}
19
}
20
return result;
21
}
22
}
Copied!
Java8 的代码简化
1
@FunctionalInterface
2
public interface ApplePredicate{
3
boolean test (Apple apple);
4
}
5
6
public class ProgressDemo {
7
8
public static List<Apple> processApple(List<Apple> appleList, ApplePredicate p) {
9
List<Apple> res = new ArrayList<>();
10
for (Apple apple : appleList) {
11
if (p.test(apple)) {
12
res.add(apple);
13
}
14
}
15
return res;
16
}
17
18
}
Copied!

Stream API

  1. 1.
    stream()
  2. 2.
    parallelStream()
    非线程安全的; 默认线程池的数量就是处理器的数量,特殊场景下可以使用系统属性: -Djava.util.concurrent.ForkJoinPool.common.parallelism={N} 调整

Lambada 表达式(链式编程)

基本语法
  1. 1.
    (parameters) -> expression
  2. 2.
    (parameters) -> { statements; }

默认方法

实现有 default 方法的接口, 可以重写 default 方法,不重写则默认使用 interface 中的默认方法。 接口有默认方法之后,个人觉得接口和抽象类之间的区别更小了。
1
public interface DefaultInterface {
2
3
void test();
4
5
default String getName() {
6
return "default";
7
}
8
}
Copied!