JDK1.8新特性
大约 3 分钟
JDK1.8都有哪些新特性?
- 接口的默认方法和静态方法
- 在Java 8中,接口可以包含默认方法和静态方法
- Lambda 表达式和函数式接口
- Lambda 表达式本质上是一段匿名内部类,可以传递一段代码
- Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中),使用 Lambda 表达式使代码更加简洁
- 但是也不要滥用,否则会有可读性等问题
- 《Effective Java》作者 Josh Bloch 建议使用 Lambda 表达式最好不要超过3行
- Stream API
- Stream API提供了一种更简洁、更易于并行处理数据集合的方式
- 通过Stream API,我们可以对集合进行过滤、映射、排序、聚合等操作,提高了代码的可读性和简洁性
- 新的日期和时间API
- Java 8引入了新的日期和时间API(java.time包),提供了更好的日期和时间处理方式
- 新的API解决了旧的Date和Calendar类在处理日期和时间时的一些问题,并提供了更多的功能和灵活性
- Optional 类
- Optional类是一个容器类,用于表示一个值可能存在或不存在
- 通过Optional类,我们可以避免空指针异常,并更好地处理可能为空的值
Lambda 表达式了解多少?
- Lambda 表达式本质上是一段匿名内部类,也可以是一段可以传递的代码
- 只有函数式接口(FunctionalInterface)才能缩写成 Lambda 表示式
Java8有哪些内置函数式接口?
- 添加了 @FunctionalInterface 注解的接口
- Comparator
- Runnable
- Callable
- Predicate
- Function
- Supplier
- Consumer
Optional了解吗?
Optional 是用于防范 NullPointerException
可以将 Optional 看做是包装对象(可能是 null , 也有可能非 null )的容器
当我们定义了 一个方法,这个方法返回的对象可能是空,也有可能非空的时候,我们就可以考虑用 Optional 来包装它,这也是在 Java 8 被推荐使用的做法
Optional<String> optional = Optional.of("bam"); optional.isPresent(); // true optional.get(); // "bam" optional.orElse("fallback"); // "bam" optional.ifPresent((s) -> System.out.println(s.charAt(0)));
Stream 流用过吗?
Stream 流,简单来说,使用 java.util.Stream 对一个包含一个或多个元素的集合做各种操作
这些操作可能是 中间操作 亦或是 终端操作
终端操作会返回一个结果,而中间操作会返回一个 Stream 流
Stream流一般用于集合,Stream的常用操作有
List<String> stringCollection = new ArrayList<>(); stringCollection.add("ddd2"); stringCollection.add("aaa2"); stringCollection.add("bbb1"); stringCollection.add("aaa1"); stringCollection.add("bbb3"); stringCollection.add("ccc"); stringCollection.add("bbb2"); stringCollection.add("ddd1");
Filter 过滤
stringCollection .stream() .filter((s) -> s.startsWith("a")) .forEach(System.out::println);
Sorted 排序
stringCollection .stream() .sorted() .filter((s) -> s.startsWith("a")) .forEach(System.out::println);
Map 转换
stringCollection .stream() .map(String::toUpperCase) .sorted((a, b) -> b.compareTo(a)) .forEach(System.out::println);
Match 匹配
// 验证 list 中 string 是否有以 a 开头的, 匹配到第一个,即返回 true boolean anyStartsWithA = stringCollection .stream() .anyMatch((s) -> s.startsWith("a")) boolean allStartsWithA = stringCollection .stream() .allMatch((s) -> s.startsWith("a")); System.out.println(allStartsWithA); // false // 验证 list 中 string 是否都不是以 z 开头的, boolean noneStartsWithZ = stringCollection .stream() .noneMatch((s) -> s.startsWith("z"))
Count 计数
// 先对 list 中字符串开头为 b 进行过滤,让后统计数量 long startsWithB = stringCollection .stream() .filter((s) -> s.startsWith("b")) .count();
- count 是一个终端操作,它能够统计 stream 流中的元素总数,返回值是 long类型
Reduce归约
Optional<String> reduced = stringCollection .stream() .sorted() .reduce((s1, s2) -> s1 + "#" + s2);
- Reduce 中文翻译为:减少、缩小。通过入参的 Function ,我们能够将 list归约成一个值。它的返回类型是 Optional 类型
Stream的常用API