函数式接口 | 函数描述符 | 原始类型特化 |
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> |
成员变量 | 局部变量 | 静态变量(类变量) | |
定义位置 | 类中、方法外 | 方法中或方法形式参数 | 类中、方法外 |
初始化 | 默认初始值 | 无默认初始值,需赋值后才能使用 | 默认初始值 |
调用方式 | 对象调用 | / | 对象调用或类名调用 |
存储位置 | 堆 | 栈 | 方法区 |
生命周期 | 对象共存亡 | 与方法共存亡 | 与类共存亡 |
操 作 | 类 型 | 返回类型 | 操作参数 | 函数描述符 |
filter | 中间 | Stream<T> | Predicate<T> | T -> boolean |
map | 中间 | Stream<R> | Function<T, R> | T -> R |
limit | 中间 | Stream<T> | ||
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<T> | BinaryOperator<T> | (T, T) -> T | 归约 |
count | 终端 | long |
工厂方法 | 返回类型 | 用 于 |
toList | List<T> | 把流中所有项目收集到一个 List |
使用示例: List<Dish> dishes = menuStream.collect(toList()); | ||
toSet | Set<T> | 把流中所有项目收集到一个 Set ,删除重复项 |
使用示例: Set<Dish> dishes = menuStream.collect(toSet()); | ||
toCollection | Collection<T> | 把流中所有项目收集到给定的供应源创建的集合 |
使用示例: Collection<Dish> dishes = menuStream.collect(toCollection(), ArrayList::new); | ||
counting | Long | 计算流中元素的个数 |
使用示例: long howManyDishes = menuStream.collect(counting()); | ||
summingInt | Integer | 对流中项目的一个整数属性求和 |
使用示例: int totalCalories = menuStream.collect(summingInt(Dish::getCalories)); | ||
averagingInt | Double | 计算流中项目 Integer 属性的平均值 |
使用示例: double avgCalories = menuStream.collect(averagingInt(Dish::getCalories)); | ||
summarizingInt | IntSummaryStatistics | 收集关于流中项目 Integer 属性的统计值,例如最大、最小、总和与平均值 |
使用示例: IntSummaryStatistics menuStatistics = menuStream.collect(summarizingInt(Dish::getCalories)); | ||
joining | String | 连接对流中每个项目调用 toString 方法所生成的字符串 |
使用示例: String shortMenu = menuStream.map(Dish::getName).collect(joining(", ")); | ||
maxBy | Optional<T> | 一个包裹了流中按照给定比较器选出的最大元素的 Optional ,或如果流为空则为 Optional.empty() |
使用示例: Optional<Dish> fattest = menuStream.collect(maxBy(comparingInt(Dish::getCalories))); | ||
minBy | Optional<T> | 一个包裹了流中按照给定比较器选出的最小元素的 Optional ,或如果流为空则为 Optional.empty() |
使用示例: Optional<Dish> lightest = menuStream.collect(minBy(comparingInt(Dish::getCalories))); | ||
reducing | 归约操作产生的类型 | 从一个作为累加器的初始值开始,利用 BinaryOperator 与流中的元素逐个结合,从而将流归约为单个值 |
使用示例: int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum)); | ||
collectingAndThen | 转换函数返回的类型 | 包裹另一个收集器,对其结果应用转换函数 |
使用示例: int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size)); | ||
groupingBy | Map<K, List<T>> | 根据项目的一个属性的值对流中的项目作问组,并将属性值作为结果 Map 的键 |
使用示例: Map<Dish.Type,List<Dish>> dishesByType = menuStream.collect(groupingBy(Dish::getType)); | ||
partitioningBy | Map<Boolean,List<T>> | 根据对流中每个项目应用谓词的结果来对项目进行分区 |
使用示例: Map<Boolean,List<Dish>> vegetarianDishes = menuStream.collect(partitioningBy(Dish::isVegetarian)); |
源 | 可分解性 |
ArrayList | 极佳 |
LinkedList | 差 |
IntStream.range | 极佳 |
Stream.iterate | 差 |
HashSet | 好 |
TreeSet | 好 |
特 性 | 含 义 |
ORDERED | 元素有既定的顺序(例如 List ),因此 Spliterator 在遍历和划分时也会遵循这一顺序 |
DISTINCT | 对于任意一对遍历过的元素 x 和 y , x.equals(y) 返回 false |
SORTED | 遍历的元素按照一个预定义的顺序排序 |
SIZED | 该 Spliterator 由一个已知大小的源建立(例如 Set ),因此 estimatedSize() 返回的是准确值 |
NONNULL | 保证遍历的元素不会为 null |
IMMUTABLE | Spliterator 的数据源不能修改。这意味着在遍历时不能添加、删除或修改任何元素 |
CONCURRENT | 该 Spliterator 的数据源可以被其他线程同时修改而无需同步 |
SUBSIZED | 该 Spliterator 和所有从它拆分出来的 Spliterator 都是 SIZED |
方 法 | 描 述 |
empty | 返回一个空的 Optional 实例 |
filter | 如果值存在并且满足提供的谓词,就返回包含该值的 Optional 对象;否则返回一个空的Optional 对象 |
flatMap | 如果值存在,就对该值执行提供的mapping函数调用,返回一个 Optional 类型的值,否则就返回一个空的 Optional 对象 |
get | 如果该值存在,将该值用 Optional 封装返回,否则抛出一个 NoSuchElementException 异常 |
ifPresent | 如果值存在,就执行使用该值的方法调用,否则什么也不做 |
isPresent | 如果值存在就返回 true ,否则返回 false |
map | 如果值存在,就对该值执行提供的 mapping函数调用 |
of | 将指定值用 Optional 封装之后返回,如果该值为 null ,则抛出一个 NullPointerException异常 |
ofNullable | 将指定值用 Optional 封装之后返回,如果该值为 null ,则返回一个空的 Optional 对象 |
orElse | 如果有值则将其返回,否则返回一个默认值 |
orElseGet | 如果有值则将其返回,否则返回一个由指定的 Supplier 接口生成的值 |
orElseThrow | 如果有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常 |
描述 | Future | FutureTask | CompletionService | CompletableFuture |
原理 | Future接口 | 接口RunnableFuture的唯一实现类,RunnableFuture接口继承自Future+Runnable | 内部通过阻塞队列+FutureTask接口 | JDK8实现了Future, CompletionStage两个接口 |
多任务并发执行 | 支持 | 支持 | 支持 | 支持 |
获取任务结果的顺序 | 按照提交顺序获取结果 | 未知 | 支持任务完成的先后顺序 | 支持任务完成的先后顺序 |
异常捕捉 | 自己捕捉 | 自己捕捉 | 自己捕捉 | 原生API支持,返回每个任务的异常 |
建议 | CPU高速轮询,耗资源,可以使用,但不推荐 | 功能不对口,并发任务这一块多套一层,不推荐使用 | 推荐使用,没有JDK8CompletableFuture之前最好的方案,没有质疑 | API极端丰富,配合流式编程,速度飞起,推荐使用! |