Skip to content

jdk8特性

一、lambda表达式

java
Thread thread = new Thread(() -> System.out.println("aaa"));

二、jdk8新接口

| 函数式接口 | 函数描述符 | 原始类型特化 |

| ----------------- | -------------- | ------------------------------------------------------------ |

| Predicate<T> | T->boolean | IntPredicate, LongPredicate, DoublePredicate |

| Consumer<T> | T->void | IntConsumer, LongConsumer, DoubleConsumer |

| Function<T,R> | T->R | IntFunction<R>, IntToDoubleFunction, IntToLongFunction, LongFunction<R>, LongToDoubleFunction, LongToIntFunction, DoubleFunction<R>, ToIntFunction<T>, ToDoubleFunction<T>, ToLongFunction<T> |

| Supplier<T> | ()->T | BooleanSupplier, IntSupplier, LongSupplier, DoubleSupplier |

| UnaryOperator<T> | T->T | IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator |

| BinaryOperator<T> | (T,T)->T | IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator |

| BiPredicate\<L,R\> | (L,R)->boolean | |

| BiConsumer<T,U> | (T,U)->void | ObjIntConsumer<T>, ObjLongConsumer<T>, ObjDoubleConsumer<T> |

| BiFunction<T,U,R> | (T,U)->R | ToIntBiFunction<T,U>, ToLongBiFunction<T,U>, ToDoubleBiFunction<T,U> |

三、使用案例

| 使用案例 | Lambda的例子 | 对应的函数式接口 |

| --------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |

| 布尔表达式 | (List<String> list) -> list.isEmpty() | Predicate<List<String>> |

| 创建对象 | () -> new Apple(10) | Supplier<Apple> |

| 消费一个对象 | (Apple a) -> System.out.println(a.getWeight()) | Consumer<Apple> |

| 从一个对象中选择/提取 | (String s) -> s.length() | Function<String, Integer> 或 ToIntFunction<String> |

| 合并两个值 | (int a, int b) -> a * b | IntBinaryOperator |

| 比较两个对象 | (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) | Comparator<Apple> 或 BiFunction<Apple, Apple, Integer> 或 ToIntBiFunction<Apple, Apple> |

四、方法引用

Lambda | 等效的方法引用

:---: | :---:

(Apple a) -> a.getWeight() | Apple::getWeight

() -> Thread.currentThread().dumpStack() | Thread.currentThread()::dumpStack

(str, i) -> str.substring(i) | String::substring

(String s) -> System.out.println(s) | System.out::println

五、流的中间操作

| 操作 | 类型 | 返回类型 | 操作参数 | 函数描述符 |

| -------- | ---- | ----------- | ---------------- | -------------- |

| filter | 中间 | Stream<T> | Predicate<T> | T -> boolean |

| map | 中间 | Stream<R> | Function<T, R> | T -> R |

| limit | 中间 | Stream<T> | long | |

| skip | 中间 | Stream<T> | long | |

| sorted | 中间 | Stream<T> | Comparator<T> | (T, T) -> int |

| distinct | 中间 | Stream<T> | | |

六、流的终端操作

| 操作 | 类型 | 目的 |

| ------- | ---- | ---------------------------------------------------- |

| forEach | 终端 | 消费流中的每个元素并对其应用Lambda。这一操作返回void |

| count | 终端 | 返回流中元素的个数。这一操作返回long |

| collect | 终端 | 把流归约成一个集合,比如List、Map 甚至是Integer。 |

七、中间操作和终端操作

| 操作 | 类型 | 返回类型 | 使用的类型/函数式接口 | 函数描述符 |

| --------- | ---- | ------------- | -------------------------- | ----------------- |

| filter | 中间 | Stream<T> | Predicate<T> | T -> boolean |

| distinct | 中间 | Stream<T> | | |

| skip | 中间 | Stream<T> | long | |

| limit | 中间 | Stream<T> | long | |

| map | 中间 | Stream<R> | Function<T, R> | T -> R |

| flatMap | 中间 | Stream<R> | Function<T, Stream<R>> | T -> Stream<R> |

| sorted | 中间 | Stream<T> | Comparator<T> | (T, T) -> int |

| anyMatch | 终端 | boolean | Predicate<T> | T -> boolean |

| noneMatch | 终端 | boolean | Predicate<T> | T -> boolean |

| allMatch | 终端 | boolean | Predicate<T> | T -> boolean |

| findAny | 终端 | Optional<T> | | |

| findFirst | 终端 | Optional<T> | | |

| forEach | 终端 | void | Consumer<T> | T -> void |

| collect | 终端 | R | Collector<T, A, R> | |

| reduce | 终端 | Optional | | |