【面经总结】Java基础 - Java8 新特性

10 阅读2分钟

Java8 新特性

Java8 有什么新特性

  1. Stream API:函数式编程思想,更方便处理集合、文件
  2. Optional 类:解决空指针异常
  3. Lambda 表达式:替代匿名内部类来实现函数式接口
  4. 默认方法:接口中可以定义默认实现

Stream API

Stream的过程

  1. 创建流
  2. 中间操作:sort、filter、map
  3. 终端操作:触发操作并获取结果

创建流的方式

  1. Stream.of()
  2. list.stream()
  3. Stream.Builder
 // Stream.of()
Stream<String> stream = Stream.of("1", "2", "3");
stream.forEach(System.out::println);

// list.stream()
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream1 = list.stream();
stream1.forEach(System.out::println);

// Stream.Builder
Stream.Builder<String> builder = Stream.builder();
builder.add("x").add("y").add("z");
Stream<String> stream2 = builder.build();
stream2.forEach(System.out::println);

Stream 有哪些功能

  1. 合并 Stream.concat(s1, s2);
  2. 过滤 filter
  3. 去重 distinct
  4. 截取元素 limit
  5. 跳过元素 skip
  6. 映射 map:一对一转换流的类型
  7. 集合扁平化 flatMap:将多级集合变成一级
  8. 排序 sorted

Stream 终端操作

  1. 查找与匹配:判断符合某个条件的数据是否存在
  2. 聚合
    1. 统计数量 count
    2. 最大最小值 max / min
    3. 平均值/求和 average / sum
  3. 规约 reduce
  4. 收集 collect
    1. Collection.toList
    2. Collection.toMap
    3. 分组 Collection.groupingBy
  5. 迭代 foreach

Optional 类

Optional 是什么

通过 Optional 可以更加安全地处理可能为空的对象,避免了在代码中出现空指针异常和大量的 if-else 语句。

Optional 的示例

// Optional<User> optionalUser = ...;

User user1 = optionalUser.orElse(new User());
System.out.println(user1);

User user2 = optionalUser.orElseGet(() -> new User());
System.out.println(user2);

User user3 = optionalUser.orElseThrow(() -> new RuntimeException());
System.out.println(user3);

optionalUser.ifPresent(user -> System.out.println(user));
/* jdk9 */
optionalUser.ifPresentOrElse(
    user -> System.out.println(user),
    () -> System.out.println("User not found")
);

方法引用

方法引用是什么

通过方法的名字来指向一个方法,来简化 lambda 表达式

方法引用的好处

Lambda 表达式简化了函数式接口的书写,方法引用简化了 Lambda 表达式的书写。

方法引用的应用场景

  1. 简化实现函数式接口
  2. 构造方法:User::new
  3. 静态方法:System.out::println

Lambda 表达式

什么是 Lambda 表达式

用于函数式编程,替代匿名内部类来实现函数式接口。

Lambda 表达式的优点

  1. 简化书写
  2. 方便进行函数式编程

Lambda 表达式的应用场景

  1. Stream 流操作
  2. 实现函数式接口