Java8 新特性
Java8 有什么新特性
- Stream API:函数式编程思想,更方便处理集合、文件
- Optional 类:解决空指针异常
- Lambda 表达式:替代匿名内部类来实现函数式接口
- 默认方法:接口中可以定义默认实现
Stream API
Stream的过程
- 创建流
- 中间操作:sort、filter、map
- 终端操作:触发操作并获取结果
创建流的方式
- Stream.of()
- list.stream()
- 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 有哪些功能
- 合并
Stream.concat(s1, s2);
- 过滤
filter
- 去重
distinct
- 截取元素
limit
- 跳过元素
skip
- 映射
map
:一对一转换流的类型 - 集合扁平化
flatMap
:将多级集合变成一级 - 排序
sorted
Stream 终端操作
- 查找与匹配:判断符合某个条件的数据是否存在
- 聚合
- 统计数量 count
- 最大最小值 max / min
- 平均值/求和 average / sum
- 规约 reduce
- 收集 collect
- Collection.toList
- Collection.toMap
- 分组 Collection.groupingBy
- 迭代 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 表达式的书写。
方法引用的应用场景
- 简化实现函数式接口
- 构造方法:
User::new
- 静态方法:
System.out::println
Lambda 表达式
什么是 Lambda 表达式
用于函数式编程,替代匿名内部类来实现函数式接口。
Lambda 表达式的优点
- 简化书写
- 方便进行函数式编程
Lambda 表达式的应用场景
- Stream 流操作
- 实现函数式接口