【JAVA】JDK8一些语言特性以及新增API记录

  1. 1. 函数式编程
  2. 2. lambda
  3. 3. 接口新特性
  4. 4. api内函数接口
  5. 5. 级联表达式和柯里化
  6. 6. Stream流编程

涵盖:函数式编程、lambda表达式、接口新特性、api内函数接口、级联表达式和柯里化、Stream流编程

函数式编程

函数式编程不需要关注实现的细节。

假如想要获取数组中数值的最小值,按照常规方式,需要使用排序或者查找算法,并且这个算法需要自己实现。在函数式编程中就会隐藏细节。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 获取最小值
public static int min(int[] arr){
// 获取最小值的实现
}

public static void main(String[] args){
int[] arr = new int[]{12,8,45,444,21};

int min_classic = min(arr);

// 而函数编程则是这样:
int min_func = IntStream.of(arr).min().getAsInt();
}

lambda

实现函数接口(只有一个方法的接口)

1
Runnable runnable = () -> System.out.println("lambda");

方法引用

1
2
3
// 方法引用
Consumer<String> consumer = Systme.out::println;
// 构造方法引用 使用 Object::new

接口新特性

新注解: @FunctionInterface 用于注解函数接口

默认方法

1
2
3
4
5
6
7
8
9
@FunctionInterface
interface InterfaceDemo{

int plus(int x, int y);

default int add(int x, int y){
return x + y;
}
}

api内函数接口

  • Predicate 断言
  • Consumer 消费一个数据
  • Function<T, R> 输入T输出R的函数
  • Supplier 提供一个数据
  • UnaryOperator 一元函数(输出输入类型相同)
  • BiFunction<T, U, R> 2个输入的函数
  • BinaryOperator 二元函数(输出输入类型相同)

级联表达式和柯里化

级联表达式

1
2
3
4
Function<Integer, Function<Integer, Function<Integer, Integer>>> func = x -> y -> z -> x + y + z;

func.apply(1).apply(2).apply(3);
// 6

柯里化:把多个参数的函数转化为只有一个参数的函数,用于标准化函数。

Stream流编程

创建

1
2
3
4
5
6
Collection.stream
Collection.parallelStream
Arrays.stream
IntStream/LongStream.range/rangeClosed
Random.ins/longs/doubles
Stream.generate/iterate

中间操作

1
2
3
4
5
6
7
8
9
10
11
// 无状态
map/mapToXxx
flatMap/flatMapToXxx
filter
peek
unordered

// 有状态
distinct
sorted
limit/skip

终止操作

1
2
3
4
5
6
7
8
9
// 非短路操作
forEach/forEachOrdered
collect/toArray
reduce
min/max/count

// 短路操作
findFirst/findAny
allMatch/anyMatch/noneMatch

并行流

1
2
3
4
5
6
7
8
9
// 并行
parallel()
// 串行
sequential()

// 自定义线程池
ForkJoinPool pool = new ForkJoinPool(20);
pool.submit(() -> stream.parallel().count());
pool.shutdown();

收集器

1
2
3
4
5
6
7
8
// 列表
stream().collect(Collectors.toList());
// 统计
stream().collect(Collectors.summarizingInt(Student::getAge));
// 分块
stream().collect(Collectors.partitioningBy(s -> s.getGender() == Gender.MALE));
// 分组
stream().collect(Collectors.groupBy(Student::getGrade));

欢迎访问博客地址:https://www.zhoyq.com