Java8的40个热门面试问题
内容提要
Java 8引入了lambda表达式、Stream API、java.time包和Iterable接口中的forEach()方法等主要特性。lambda表达式提供了一种简洁的方式来表达单方法接口的实例。Stream API促进了对元素流的函数式操作。forEach()方法改进了迭代集合的方式。默认方法可以在接口中添加新方法。java.time包提供了日期和时间操作的类。函数式接口和lambda表达式有区别。方法引用提供了调用方法的简写符号。filter()操作选择元素。Optional避免空指针异常。Collector接口提供了归约操作。@FunctionalInterface注解确保接口只有一个抽象方法。并行流提高性能。groupingBy()收集器分组元素。reduce()操作缩减元素。flatMap()展平嵌套集合。peek()方法调试流。CompletableFuture实现异步计算。Nashorn是JavaScript引擎。IntSupplier和Supplier接口提供函数式接口。try-with-resources简化资源管理。Effectively Final变量在lambda表达式中使用。merge()和compute()方法的区别。Comparator接口排序。Spliterator迭代元素。BiConsumer操作映射条目。Files.lines()简化文件读取。Collectors.partitioningBy()根据谓词分组。方法链提高可读性。peek()和forEach()方法的差异。UnaryOperator操作单个操作数。BiFunction接受两个参数。新的日期和时间API改进了旧的Date类。Optional.orElseGet()方法返回值或调用供应商。Consumer接口操作元素。CompletableFuture.supplyAsync()启动异步计算。Files.walk()遍历文件树。java.util.function包提供函数式接口。parallel()方法转换为并行流。
延伸解读
从面试题看Java 8的核心变革
这40个问题集中覆盖了Java 8的几大革新:lambda表达式与函数式接口、Stream API、新的日期时间API、Optional以及CompletableFuture等。它们共同指向一个趋势——Java开始支持更简洁的函数式编程风格,并增强了对并行处理和异步编程的内建支持。理解这些特性之间的关联,比孤立记忆每个问题的答案更有价值。
Stream API的操作分类是理解关键
文中多次区分了中间操作与终端操作,例如peek()是中间操作,forEach()是终端操作;filter()也是中间操作。这种分类直接影响流的执行时机和副作用。掌握这一区分,就能理解为什么peek()可用于调试而不消耗流,以及方法链中各个操作的顺序如何影响结果。
并行与异步:性能提升但有前提
文章提到并行流利用多处理器提高性能,CompletableFuture提供异步编程框架。但并行流并非总是更快,其效果取决于数据量、任务类型和硬件;CompletableFuture则涉及线程池和异常处理等复杂点。面试中若能指出这些适用条件和潜在开销,会比单纯罗列优点更显深入。
新API对旧问题的针对性改进
java.time包解决了旧Date类的诸多限制,Optional旨在减少空指针异常,try-with-resources简化了资源关闭,默认方法允许接口在不破坏实现类的情况下演进。这些特性都是针对Java长期存在的痛点而设计,理解它们“为什么出现”有助于在面试中展现对语言演进的洞察。
Q&A
Java 8 有哪些主要新特性?
Java 8 引入了 lambda 表达式、Stream API、java.time 包以及 Iterable 接口中的 forEach() 方法等主要特性。
Java 8 中的 lambda 表达式是什么?能举个例子吗?
Lambda 表达式提供了一种简洁的方式来表示单方法接口(函数式接口)的实例。例如:(a, b) -> a + b。
Stream API 中的 filter() 方法有什么作用?
filter() 是一个中间操作,它根据给定的谓词选择流中的元素。例如:myList.stream().filter(s -> s.length() > 3).forEach(System.out::println);
Java 8 的 Optional 类有什么优点?
Optional 是一个容器对象,用于表示可选值。它有助于避免空指针异常,并使代码更具可读性。
Java 8 中 peek() 和 forEach() 方法有什么区别?
peek() 是一个中间操作,允许对每个元素执行操作而不消耗流;forEach() 是一个终端操作,会消耗流中的元素。
CompletableFuture 在 Java 8 中如何支持异步编程?
CompletableFuture 提供了异步编程的框架,可以实现异步计算的组合。例如,supplyAsync() 方法启动异步计算并返回一个 CompletableFuture。