Lambda 与 Stream API 与 Optional 与函数式编程

共 89 题
#

1. Collector 标记为 CONCURRENT 时还需要满足哪些线程安全条件,UNORDERED 特征有何作用

A CONCURRENT 要求累加器与容器线程安全,UNORDERED 允许无序处理提升并行度 ✓ 正确答案
B UNORDERED 要求有序
C CONCURRENT 与线程安全无关
D CONCURRENT 无需线程安全
#

2. Collector.CONCURRENT 与 UNORDERED 特征在并行流中的线程安全要求与性能影响

A CONCURRENT 省合并但需容器线程安全,UNORDERED 省顺序同步,均提升并行性能 ✓ 正确答案
B 两者都会降低性能,应避免使用
C CONCURRENT 对容器无线程安全要求
D UNORDERED 要求结果必须保持有序
#

3. Gatherers.mapConcurrent 如何限制并发度和保持遇见顺序,映射函数阻塞时有什么边界

A 用固定并发度映射并保持遇见顺序,映射函数阻塞时受并发度限制(有序输出使阻塞元素卡住后续) ✓ 正确答案
B 它不保持顺序
C 并发度无限
D 输出乱序
#

4. Lambda 捕获的局部变量为何必须有效 final,捕获可变对象引用后又有哪些并发风险

A 捕获的局部变量必须有效 final(值稳定),捕获可变对象引用时对象可变仍有并发风险需线程安全 ✓ 正确答案
B 引用可变对象无风险
C 局部变量可随意修改
D 捕获变量可被修改
#

5. Spliterator 在并行流(Parallel Stream)中的拆分策略与工作线程调度

A Spliterator.trySplit 递归拆分数据源,ForkJoinPool.commonPool 用 work-stealing 调度子任务 ✓ 正确答案
B 拆分与调度无关
C 并行流不用 Spliterator
D 并行流用单线程
#

6. Stream 与集合转换(toList/toUnmodifiableList)的演进

A Stream.toList()(JDK 16)返回不可变 List 更简洁,toUnmodifiableList 不可变,Collectors.toList 可变 ✓ 正确答案
B toList() 返回可变 List
C toList() 不能用于 Stream
D 所有转换都返回可变
#

7. Stream 并行流(parallelStream)的线程模型与坑点

A 并行流用独立线程池
B 并行流用共享 commonPool,阻塞 I/O 占线程、共享可变状态竞态、有状态操作屏障是主要坑点 ✓ 正确答案
C 并行流无共享状态问题
D 阻塞 I/O 不影响并行流
#

8. 即使使用线程安全集合仍有何风险

A 线程安全集合使并行流完全安全
B 线程安全集合消除竞态但副作用反模式、性能、顺序不保证仍存在,应避免副作用用纯函数/collect ✓ 正确答案
C 副作用收集是推荐做法
D 线程安全集合保证顺序
#

9. 序列化 Lambda 为什么依赖 SerializedLambda 与实现细节,持久化任务定义时应采用什么替代方案

A Lambda 序列化为普通对象
B 序列化 Lambda 稳定
C Lambda 序列化走 SerializedLambda(记录捕获参数与实现方法),脆弱不稳定,持久化任务用显式任务描述替代 ✓ 正确答案
D 可直接持久化 Lambda
#

10. @FunctionalInterface 的真实价值

A 它无作用
B 它是必需的
C 它提供编译期强制单抽象方法约束与文档契约,防止接口被破坏保护 Lambda 兼容性 ✓ 正确答案
D 它允许多个抽象方法
#

11. @FunctionalInterface 的语义化命名

A 命名无需语义
B 命名任意即可
C 标准接口覆盖所有场景
D 命名应语义化体现用途(Function/Consumer/Supplier/Predicate),优先复用标准接口,自定义体现功能 ✓ 正确答案
#

12. BiFunction/BiPredicate 的限制与替代方案

A BiFunction/BiPredicate 最多两参,多参需自定义函数式接口、参数对象或柯里化 ✓ 正确答案
B 有 TriFunction 标准接口
C 标准接口支持任意参数
D 两参是无限制的
#

13. BinaryOperator/UnaryOperator 与 Function 的关系及 IntBinaryOperator 等特化类型的性能价值

A BinaryOperator 是 Function 特化
B IntBinaryOperator 会装箱
C 原始类型特化无价值
D BinaryOperator/UnaryOperator 是 BiFunction/Function 的同类型特化,原始类型特化(IntBinaryOperator)避免装箱提升性能 ✓ 正确答案
#

14. Collectors.teeing 如何在一次遍历中组合两个下游结果,两个收集器的状态是否共享

A 只能一个下游
B 两个下游共享状态
C 需两次遍历
D teeing 一次遍历喂两个下游收集器,各自状态独立,最终 merger 合并,避免多次遍历 ✓ 正确答案
#

15. Comparator 的函数式构造(comparing/thenComparing)

A comparing 按键生成比较器,thenComparing 链式添加次级条件,reversed/nullsFirst 组合排序 ✓ 正确答案
B comparing 只能比较一个字段
C thenComparing 不能链式
D 排序需手写
#

16. Function.compose/andThen 的执行顺序

A compose 先执行参数函数再自身(f(g(x))),andThen 先自身再参数函数(g(f(x))),顺序相反 ✓ 正确答案
B compose 先自身
C 两者顺序相同
D andThen 先参数函数
#

17. Gatherer 的 Integrator 如何发出多个、一个或零个元素,并通过返回值请求上游短路

A 只能发出一个元素
B 不能短路
C Integrator 通过 downstream.push 发出 0/1/多个元素,返回 false 请求上游短路停止 ✓ 正确答案
D 返回 void
#

18. Gatherers.scan 与 fold 都能维护状态,它们输出中间结果和最终结果的语义有何差异

A scan 输出最终结果
B scan 输出每个元素的中间累加结果(前缀扫描,长度同输入),fold 只输出最终归约结果 ✓ 正确答案
C 两者输出相同
D fold 输出中间结果
#

19. IntStream 等原始类型流如何减少装箱,转换为 boxed 后在哪些操作中会重新产生对象

A 原始流也会装箱
B 原始类型流避免装箱提升性能,boxed() 转回对象流重新装箱,需对象的操作才 boxed ✓ 正确答案
C boxed() 不产生对象
D 原始流无法提高性能
#

20. JEP 485 与现有 Stream 操作(map/filter)

A JEP 485 替代 map/filter
B JEP 485 与 map/filter 无关
C JEP 485 引入 Gatherers(自定义中间操作),补充 map/filter 等内置操作无法表达的状态化/窗口化操作 ✓ 正确答案
D Gatherers 是内置操作
#

21. IntStream.range/rangeClosed 的边界差异

A 两者都含 end
B range 左闭右开(不含 end),rangeClosed 闭区间(含 end),按是否包含上界选择 ✓ 正确答案
C rangeClosed 不含 end
D range 含 end
#

22. IntStream/LongStream/DoubleStream 特化的性能价值

A 原始流会增加装箱
B 原始类型流避免装箱、内存紧凑、提升数值性能,用于数值密集场景 ✓ 正确答案
C 原始流性能更差
D 原始流只能用于小数据
#

23. JDK 21+ Optional.or 与 ifPresentOrElse 的工程价值

A or 只在有值时返回
B or 提供空值回退(可选链),ifPresentOrElse 提供有值/无值两分支函数式处理 ✓ 正确答案
C ifPresentOrElse 只能处理有值
D or 不支持链式
#

24. Java 9 Optional.stream() 与 Optional.or 的工程价值

A stream() 只能用于单 Optional
B or 只能返回同值
C stream() 把 Optional 转 Stream 展平可选值,or 提供空值回退,提升函数式管道协作 ✓ 正确答案
D 两者互斥
#

25. Java 9 Stream.takeWhile/dropWhile 的应用

A takeWhile 丢弃满足前缀
B dropWhile 取前缀
C takeWhile 取满足条件的前缀(到第一个不满足停止),dropWhile 丢弃满足条件的前缀 ✓ 正确答案
D 两者语义相同
#

26. Java 函数式编程的核心思想(纯函数、引用透明、柯里化)

A 纯函数可有副作用
B 纯函数无副作用、引用透明可替换、柯里化把多参数转单参数,Java 用 Lambda 支持但非纯函数式 ✓ 正确答案
C 引用透明无意义
D 柯里化是 Java 内建
#

27. Lambda 中的 this 与外部作用域

A Lambda 的 this 指向自身
B Lambda 有自身 this
C Lambda 不能访问外层字段
D Lambda 的 this 指向外层类实例(无自身 this),与匿名类(this 是自身)相反 ✓ 正确答案
#

28. Lambda 序列化的局限

A 所有 Lambda 可序列化
B 序列化稳定
C 无需 cast
D 只有 Serializable 函数式接口可序列化,且依赖 SerializedLambda 跨版本不稳定,不用于持久化 ✓ 正确答案
#

29. Lambda 表达式的实现原理(invokedynamic + LambdaMetafactory)

A Lambda 用 invokedynamic + LambdaMetafactory 动态生成函数式接口实例,惰性、可内联、比匿名类高效 ✓ 正确答案
B Lambda 编译期生成类文件
C Lambda 用反射调用
D Lambda 编译为匿名类
#

30. Optional 与 Stream 协作(stream()/filter)

A Optional.stream() 转 Stream 展平可选值、filter 条件过滤,配合 Stream 管道实现函数式处理 ✓ 正确答案
B Optional.stream() 无法展平
C Optional 不能与 Stream 用
D filter 只放行空值
#

31. Optional 与 Stream 在链式调用中空值处理的协作模式

A 两者不能协作
B flatMap 无法展平
C 空值需手动 if
D Optional 处理单值空、Stream 处理集合,用 flatMap(Optional::stream)/Optional.flatMap 衔接避免嵌套空值检查 ✓ 正确答案
#

32. Optional 与 null 在序列化上的差异

A Optional 序列化为 null
B Optional 是容器对象(序列化含容器结构),null 是"无值",JSON 序列化 Optional 需特殊处理 ✓ 正确答案
C 两者序列化相同
D Optional 适合作字段
#

33. Optional 作为方法参数/字段的反模式

A Optional 适合作字段
B Optional 作参数是推荐
C Optional 适合返回值(提示可空),作参数强制构造、作字段浪费容器且可变,都是反模式 ✓ 正确答案
D Optional 只能作字段
#

34. Optional 的本质(容器对象)及其使用边界

A Optional 适合作字段
B Optional 是容器对象,适合返回值表示可空,不适合字段/参数/集合/有业务含义的空值 ✓ 正确答案
C Optional 适合集合元素
D Optional 用于表达空值有效
#

35. Optional 的正确使用与反模式(isPresent/get)

A isPresent+get 是推荐
B 正确用 map/orElse/orElseGet 链式处理,isPresent+get 是反模式(get 空抛异常),orElse 总是求值应 orElseGet ✓ 正确答案
C orElse 与 orElseGet 相同
D get 空时返回 null
#

36. Optional.map/flatMap 与 stream 链的语义差异

A map 转换不展平(f 返回普通值),flatMap 展平(f 返回 Optional/Stream),Optional 处理单值、Stream 处理多元素 ✓ 正确答案
B flatMap 不展平
C map 展平
D Optional 与 Stream 的 map 语义不同
#

37. Optional.of/ofNullable/empty 的合法参数

A of 接受 null
B ofNullable 要求非空
C of 要求非空(null 抛 NPE)、ofNullable 接受 null(返回 empty)、empty 无参数 ✓ 正确答案
D empty 接受参数
#

38. Optional.orElse/orElseGet/orElseThrow 的差异

A orElse 总是求值(适合常量)、orElseGet 惰性(适合昂贵默认)、orElseThrow 空时抛异常 ✓ 正确答案
B orElse 惰性求值
C orElseGet 总是求值
D orElseThrow 空时返回 null
#

39. OptionalInt/OptionalLong/OptionalDouble 的价值

A 它们会装箱
B 原始类型 Optional 避免装箱,用于原始流聚合结果(min/max/reduce),性能好 ✓ 正确答案
C 与 Optional<Integer> 相同
D 无价值
#

40. groupingBy 默认返回的 Map 实现与迭代顺序,如何用 LinkedHashMap 或自定义 Map 工厂保持遇见顺序

A 默认保持顺序
B 无法保持顺序
C 默认 TreeMap
D groupingBy 默认 HashMap 无序,用 LinkedHashMap::new 作 mapFactory 可保持分组键的遇见顺序 ✓ 正确答案
#

41. Predicate 的复合(and/or/negate)

A Predicate 的 and/or/negate 默认方法组合谓词(与/或/非),声明式组合多个过滤条件 ✓ 正确答案
B 不能组合谓词
C negate 要手写
D and/or 是静态方法
#

42. Spliterator 的特征(SIZED/DISTINCT/SORTED)对并行的影响

A SIZED/DISTINCT/SORTED 让 Stream 优化拆分/去重/排序,错误声明特征会导致并行结果错误 ✓ 正确答案
B 特征无影响
C 特征只影响顺序
D 错误声明无害
#

43. Stream 与 ForkJoinPool 的关系(默认 commonPool)

A 并行流默认用共享 commonPool,阻塞会互相影响,需控制并发时可提交到自定义 ForkJoinPool ✓ 正确答案
B 每个并行流用自己的池
C commonPool 无共享
D 并行流不用池
#

44. Stream 中副作用(side effect)的反模式

A 副作用是推荐
B 在流中修改外部可变状态违背纯函数与惰性,结果不确定、并行竞态,应改用 collect/纯函数 ✓ 正确答案
C forEach 副作用安全
D 副作用可并行
#

45. Stream 中状态(stateful)与无状态操作的顺序敏感性

A 有状态操作并行高效
B 无状态操作(map/filter)元素独立可并行,有状态操作(distinct/sorted/limit)依赖整体或顺序需屏障 ✓ 正确答案
C 有状态操作无顺序依赖
D 无状态操作需屏障
#

46. Stream 中间操作与终止操作的惰性求值机制

A 中间操作惰性登记不执行,终止操作触发整个管道执行,支持短路与无限流 ✓ 正确答案
B 中间操作立即执行
C 终止操作不执行
D 中间操作产生中间结果
#

47. Stream 的 lazy evaluation 与短路操作(Short-circuit)在内存占用上的边界

A 短路增加内存
B 有状态操作不占内存
C 无状态操作低内存、短路提前停止降内存,但有状态操作(sorted)缓冲元素可能 OOM ✓ 正确答案
D 无限流+limit 会 OOM
#

48. Stream 的 null 元素处理(Objects::nonNull)

A Stream 不含 null
B toList() 允许 null
C Stream 可能含 null,用 Objects::nonNull 过滤避免 NPE,toList() 禁 null 需过滤 ✓ 正确答案
D null 元素无需处理
#

49. Stream 的 peek 调试用途与生产禁用

A peek 用于调试观察中间元素,副作用在生产不可依赖(惰性/短路/违背纯函数),生产禁用 ✓ 正确答案
B peek 保证执行
C peek 是纯函数
D peek 用于生产副作用
#

50. Stream 的 short-circuit 操作(findAny/anyMatch)的性能意义

A 短路操作(findAny/anyMatch)提前终止减少处理,findAny 并行最优(不保序),findFirst 需保序 ✓ 正确答案
B 短路要处理全量
C findAny 保序
D 短路无性能优势
#

51. Stream 管道中抛出受检异常时,包装成运行时异常、返回结果类型与提前校验应如何取舍

A 可预期失败用 Result/提前校验,意外异常包装运行时异常并保留 cause,避免吞异常 ✓ 正确答案
B 直接抛受检异常
C 管道内吞异常
D 只能包装
#

52. Stream 顺序与并行的选择准则在 CPU 密集型与 I/O 密集型下的取舍

A CPU 密集大数组用并行提升吞吐,I/O 密集避免并行流(阻塞占线程),小数据顺序即可 ✓ 正确答案
B 并行总是更好
C I/O 密集用并行流
D 小数据用并行
#

53. Stream.iterate 与 generate 的有状态行为差异

A iterate 依赖前值生成(有状态可预测),generate 每次调 Supplier(无前值依赖,状态需自行维护) ✓ 正确答案
B iterate 无状态
C 两者相同
D generate 依赖前值
#

54. Stream.onClose 的处理器何时执行,为什么仅调用终止操作并不会自动关闭普通 Stream

A 普通 Stream 自动关闭
B 终止操作自动关闭
C 终止操作执行 onClose
D onClose 处理器仅在显式 close/try-with-resources 时执行,普通终止操作不关闭 Stream,资源型需关闭 ✓ 正确答案
#

55. Supplier 与懒求值的工程应用

A Supplier 把计算延迟到消费时(懒求值),用于 Optional.orElseGet、Stream.generate、惰性初始化 ✓ 正确答案
B Supplier 立即求值
C Supplier 不能懒加载
D Supplier 有参数
#

56. collect、Collectors 与归约(reduce)的取舍

A reduce 归约标量(求和/最大,需可结合),collect/Collectors 收集到集合/映射,按目标选择 ✓ 正确答案
B collect 用于标量
C reduce 用于收集到集合
D 两者相同
#

57. distinct、sorted 和 limit 等有状态操作如何影响并行管道的缓冲、屏障和内存占用

A 有状态操作并行高效
B distinct/sorted/limit 在并行下缓冲元素、引入会合屏障、占用内存,破坏流水线降低并行度 ✓ 正确答案
C 有状态操作提高并行度
D 有状态操作无缓冲
#

58. findFirst 与 findAny 在并行流中的确定性和短路成本有何差异,何时可选择后者

A findAny 保序
B findFirst 保序确定(并行有顺序成本),findAny 任意元素(并行性能好),不关心顺序用 findAny ✓ 正确答案
C findFirst 并行最优
D 两者相同
#

59. flatMap 创建的子流在消费后如何关闭,子流绑定文件资源时应怎样注册清理动作

A 资源型子流会自动关闭
B 关闭无法注册
C 子流不需要关闭
D flatMap 消费子流通常自动关闭,但资源型子流需 onClose/try-with-resources 注册清理,避免句柄泄漏 ✓ 正确答案
#

60. flatMap、mapMulti(JDK 16+)的差异与一对一/多对多场景

A mapMulti 创建临时 Stream
B 两者相同
C flatMap 每元素返回 Stream(临时对象),mapMulti 用回调避免临时 Stream 更高效,适合少量展开 ✓ 正确答案
D flatMap 更高效
#

61. groupingBy 与 partitioningBy 的差异与下游收集器

A groupingBy 任意键分组、partitioningBy 布尔二分,都支持下游收集器对每组进一步收集 ✓ 正确答案
B partitioningBy 任意键分组
C 两者无下游收集器
D groupingBy 是布尔二分
#

62. groupingByConcurrent 在有序并行流中是否一定更快,热点分组键会造成怎样的竞争

A 它不用 ConcurrentHashMap
B 它总比 groupingBy 快
C 热点键无竞争
D 有序流需保持顺序不一定更快,热点分组键(分布不均)造成 ConcurrentHashMap 桶竞争 ✓ 正确答案
#

63. mapMulti 与 flatMap 在少量展开元素时如何减少临时 Stream 分配,回调使用有什么限制

A mapMulti 用回调直接产出避免临时 Stream(适合少量展开),回调须同步使用不能延迟调用 ✓ 正确答案
B mapMulti 创建临时 Stream
C 回调可延迟调用
D mapMulti 适合大量展开
#

64. peek 受惰性求值和操作优化影响为何不适合作为业务副作用,调试时应如何使用

A peek 因惰性求值与操作优化不保证执行,副作用不可依赖,只用于调试观察中间元素 ✓ 正确答案
B peek 适合业务副作用
C peek 保证执行
D peek 总是执行
#

65. takeWhile 在无序并行流上的语义为什么较弱,保留遇见顺序会带来什么性能代价

A 无序并行语义明确
B takeWhile 依赖前缀有序语义,无序并行语义弱;有序并行取前缀需顺序合并屏障降低并行度 ✓ 正确答案
C takeWhile 不依赖顺序
D 并行无代价
#

66. 使用减法或浮点累加执行并行归约为何可能得到不同结果,应该怎样设计可结合的归约

A 浮点累加结果确定
B 减法可结合
C 减法不可结合、浮点累加舍入误差致结果随顺序变化,并行归约需可结合+恒等 ✓ 正确答案
D 并行归约无需结合
#

67. 分析 Stream 性能时如何区分数据源拆分、Lambda 分配、装箱和终止收集各自的成本

A 只测整体即可
B 用 JMH 控制变量分别测拆分/Lambda/装箱/收集,用分配器定位对象分配瓶颈 ✓ 正确答案
C 无法区分成本
D 装箱无成本
#

68. 四大核心函数式接口(Function/Consumer/Supplier/Predicate)的典型签名与选择依据

A Function 无输出
B Function 输入→输出、Consumer 消费、Supplier 供给、Predicate 断言,按输入输出形态选择 ✓ 正确答案
C Supplier 有输入
D Predicate 输出对象
#

69. 复用已经执行终止操作的 Stream 为什么抛 IllegalStateException,管道应如何重新创建

A Stream 可重复终端
B Stream 一次性,终止操作后再次操作抛 IllegalStateException,需从数据源重新创建管道 ✓ 正确答案
C 终止操作不关闭流
D 可复用已终端 Stream
#

70. 方法引用在实例方法与未绑定接收者形式下,函数式接口第一个参数分别如何参与调用

A 已绑定接收者作为第一个参数
B 已绑定 obj::method 接收者固定,未绑定 Type::method 接收者作为函数式接口第一个参数 ✓ 正确答案
C 未绑定接收者固定
D 两者相同
#

71. 方法引用(Class::method)的四种形式与可读性

A 未绑定实例接收者固定
B 只有两种形式
C 构造器引用接收者
D 四种形式:静态、已绑定实例、未绑定实例、构造器,Lambda 只调用方法时用方法引用更可读 ✓ 正确答案
#

72. 方法引用(Method Reference)与 Lambda 在字节码 invokedynamic 调用点的差异

A 两者都编译为 invokedynamic + LambdaMetafactory,方法引用直接绑定目标方法,Lambda 包装私有方法 ✓ 正确答案
B Lambda 不用 LambdaMetafactory
C 方法引用不用 invokedynamic
D 两者字节码相同
#

73. 无限 Stream 使用 limit 能否保证终止,若前面放置有状态过滤或排序会发生什么

A 无限流+limit 总有状态
B limit 无法终止无限流
C sorted 在无限流可终止
D 无限流+limit 短路可终止,但 limit 前有状态操作(sorted/distinct)需缓冲无限增长无法终止 ✓ 正确答案
#

74. 柯里化(Currying)与部分应用在 Java 中的实现

A 柯里化用 Function 嵌套转单参链,部分应用用闭包固定部分参数,Java 手动嵌套实现 ✓ 正确答案
B 柯里化用闭包固定参数
C 部分应用是单参转多参
D Java 内建柯里化
#

75. 流式管道复用(多次 terminal)的失败原因

A Stream 一次性,terminal 后已消费再次操作抛 IllegalStateException,需封装为重建函数 ✓ 正确答案
B Stream 可多次 terminal
C 可复用已终端流
D terminal 不消费流
#

76. distinct 的底层实现(HashSet/LinkedHashSet)在顺序流与并行流中的内存与性能特征

A distinct 无缓冲
B distinct 用哈希去重(顺序保序、并行并发去重+合并),内存与不同元素数成正比,并行有合并开销 ✓ 正确答案
C distinct 并行无合并
D distinct 不占内存
#

77. flatMap 实现嵌套循环与笛卡尔积时的中间 Stream 数量与资源开销控制

A 笛卡尔积无开销
B 中间 Stream 数量少
C flatMap 嵌套笛卡尔积每外层元素产生中间 Stream,元素数随维度爆炸,用 mapMulti 或控制规模 ✓ 正确答案
D 笛卡尔积线性增长
#

78. 自定义 Collector 的五要素(supplier/accumulator/combiner/finisher/characteristics)与 toList 实现

A combiner 建容器
B supplier 合并容器
C finisher 建容器
D 五要素:supplier 建容器、accumulator 累加、combiner 合并、finisher 转换、characteristics 特征,toList 用 ArrayList+add+addAll ✓ 正确答案
#

79. 自定义 Gatherer 支持并行执行时,合并器必须满足哪些约束,状态不可合并时应如何声明

A 合并器无需可结合
B 并行 Gatherer 合并器需可结合、与初始状态一致、无副作用,状态不可合并时退化为顺序执行 ✓ 正确答案
C 状态不可合并也并行
D 合并器无约束
#

80. 自定义 Spliterator 错误声明 SIZED、SORTED 或 DISTINCT 特征,会使 Stream 得出哪些错误假设

A 错误声明无影响
B 特征可任意声明
C 错误声明 SIZED/SORTED/DISTINCT 让 Stream 产生错误假设(跳过排序/去重、拆分错误),导致结果错误 ✓ 正确答案
D 错误声明只影响性能
#

81. 虚拟线程适合大量阻塞任务,而并行 Stream 适合数据并行,两者的选型依据是什么

A 阻塞任务用并行 Stream
B 并行 Stream 适合阻塞
C 虚拟线程适合大量阻塞任务(I/O 密集、任务并发),并行 Stream 适合数据并行(CPU 密集、数据分块) ✓ 正确答案
D 两者相同
#

82. Stream reduce 的 identity、accumulator 与 combiner 需要满足哪些代数性质才能保证确定结果

A 性质与结果无关
B identity 无需恒等
C accumulator 无需可结合
D reduce 需 identity 恒等、accumulator/combiner 可结合且与 identity 兼容,才能保证并行归约确定 ✓ 正确答案
#

83. 并行流默认使用 ForkJoinPool.commonPool 时,阻塞 I/O 会怎样影响其他业务的并行任务

A 阻塞只影响本任务
B 阻塞无害
C commonPool 线程无限
D 并行流用共享 commonPool,阻塞 I/O 占有限线程导致其他并行任务饥饿/并行度下降,应避免阻塞或隔离池 ✓ 正确答案
#

84. Gatherers.windowFixed 与 windowSliding 对尾部不足窗口的处理有何不同,内存开销如何估算

A windowFixed 尾部也输出
B windowFixed 固定非重叠窗口(尾部不足丢弃),windowSliding 滑动重叠窗口(尾部不足也输出),内存 O(n) ✓ 正确答案
C 两者都尾部丢弃
D 内存 O(n²)
#

85. JDK 25 Stream Gatherers 在 ETL 场景下的窗口化与状态化处理优势

A Gatherers 只支持 map
B Gatherers 支持窗口批处理(windowFixed)、状态化累积、组合与并发,适合 ETL 清洗/批量加载 ✓ 正确答案
C Gatherers 无状态
D Gatherers 无窗口
#

86. JDK 24 定稿的 JEP 485 Stream Gatherers 自定义中间操作的 API 设计要点是什么

A Gatherer 含 initializer/integrator/combiner/finisher,支持状态化、并行、短路、组合,是自定义中间操作扩展点 ✓ 正确答案
B Gatherer 只有 integrator
C Gatherer 不支持并行
D Gatherer 是操作符
#

87. JEP 485 将 Stream Gatherers 定稿后,Gatherer 的初始化器、集成器、合并器和完成器各负责什么

A initializer 建状态、integrator 逐元素处理(可发元素/短路)、combiner 合并、finisher 收尾 ✓ 正确答案
B integrator 建状态
C finisher 逐元素
D combiner 收尾
#

88. 嵌套 parallelStream 为什么可能争用同一个公共池,如何通过基准确认过度并行问题

A 嵌套用独立池
B 嵌套无争用
C 嵌套 parallelStream 共用 commonPool,产生线程争用、过度并行、可能死锁,用 JMH/线程监控基准确认 ✓ 正确答案
D 嵌套提高并行度
#

89. 如何将并行流提交到自定义 ForkJoinPool 而非 commonPool,及由此带来的收益与风险

A 并行流只能用 commonPool
B 用 ForkJoinPool.submit 包裹并行流使其用自定义池,收益是隔离与并发度可控,风险是资源管理与 join 处理 ✓ 正确答案
C 无风险
D 无法用自定义池