JAVA8之后的版本履历

本文介绍了Java 8至Java 11的主要新特性,包括接口默认方法、重复注解、类型注解、更好的类型推断、Optional、Stream、日期时间API、Base64支持、并行数组排序、Jigsaw模块系统、JShell REPL、多版本兼容jar包、局部变量类型推断、GC改进和内存管理等。这些改进提升了Java的易用性和性能,例如引入了局部变量类型推断(var关键字),增强了字符串和集合处理,以及改进了垃圾收集机制。
摘要由CSDN通过智能技术生成

静态方法引用

使用方式:Class::staticMethod

test.operate(1, 2, Test::add);

对象的实例方法引用

使用方式:instance::method

test.operate(1, 2, test::sub);

类的实例方法引用

使用方式:Class::method

test.test(Test::testM);

其实上面三种方法引用都好理解,最后类的实例方法引用,有两个条件:

  • 首先要满足实例方法,而不是静态方法

  • Lambda 表达式的第一个参数会成为调用实例方法的对象

根据这两点我们看上面的例子,test 方法接受一个 TestInt 实例,用 Lambda 表达式表示就是 (Test t1, Test t2) -> res,而我们调用 test 方法时传入的方法引用是 Test::testM,其参数也是一个 Test 实例,最终 test.test(Test::testM) 的调用效果就是 t1.testM(t2)

2.1.3 接口默认方法和静态方法

Java 8 新增了接口的默认实现,通过 default 关键字表示。同时也可以提供静态默认方法。

public interface TestInterface {

String test();

// 接口默认方法

default String defaultTest() {

return “default”;

}

static String staticTest() {

return “static”;

}

}

2.1.4 重复注解

Java 8 支持了重复注解。在 Java 8 之前想实现重复注解,需要用一些方法来绕过限制。比如下面的代码。

@interface Author {

String name();

}

@interface Authors {

Author[] value();

}

@Authors({@Author(name=“a”), @Author(name = “b”)})

class Article {

}

而在 Java 8 中,可以直接用下面的方式。

@Repeatable(Authors.class)

@interface Author {

String name();

}

@interface Authors {

Author[] value();

}

@Author(name = “a”)

@Author(name = “b”)

class Article {

}

在解析注解的时候,Java 8 也提供了新的 API。

AnnotatedElement.getAnnotationsByType(Class)

2.1.5. 类型注解

Java 8 之前注解只能用在声明中,在 Java 8 中,注解可以使用在 任何地方。

@Author(name=“a”)

private Object name = “”;

private String author = (@Author(name=“a”)String) name;

2.1.6. 更好的类型推断

Java 8 对于类型推断做了改进。

比如在 Java 7 中下面的写法:

List stringList = new ArrayList<>();

stringList.add(“A”);

stringList.addAll(Arrays.asList());

在 Java 8 中改进后的写法,可以自动做类型推断。

List stringList = new ArrayList<>();

stringList.add(“A”);

stringList.addAll(Arrays.asList());

2.1.7. Optional

Java 8 中新增了 Optional 类用来解决空指针异常。Optional 是一个可以保存 null 的容器对象。通过 isPresent() 方法检测值是否存在,通过 get() 方法返回对象。

除此之外,Optional 还提供了很多其他有用的方法,具体可以查看文档。下面是一些示例代码。

// 创建一个 String 类型的容器

Optional str = Optional.of(“str”);

// 值是否存在

boolean pre = str.isPresent();

// 值如果存在就调用 println 方法,这里传入的是 println 的方法引用

str.ifPresent(System.out::println);

// 获取值

String res = str.get();

// 传入空值

str = Optional.ofNullable(null);

// 如果值存在,返回值,否则返回传入的参数

res = str.orElse(“aa”);

str = Optional.of(“str”);

// 如果有值,对其调用映射函数得到返回值,对返回值进行 Optional 包装并返回

res = str.map(s -> “aa” + s).get();

// 返回一个带有映射函数的 Optional 对象

res = str.flatMap(s -> Optional.of(s + “bb”)).flatMap(s -> Optional.of

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值