Java16新特性及代码示例
Java 16 于 2021 年 3 月 16 日发布。在这篇文章中,我们将介绍添加的一些特性以及一些代码示例。
Java16的主要更新内容如下:
- 时段支持
- 添加Stream.toList方法
- instanceof的模式匹配
- 密封类(第二次预览版)
- record纪录类(标准版)
1. 时段支持
DateTimeFormatter的新增功能,可以表示一天中的时段,例如“上午”、“下午”
package cn.dayangshuo.collectors;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* @author DAYANG
*/
public class DateTimeTest {
public static void main(String[] args) {
String date1 = DateTimeFormatter.ofPattern("a").format(LocalTime.now());
String date2 = DateTimeFormatter.ofPattern("B").format(LocalTime.now());
String date3 = DateTimeFormatter.ofPattern("k").format(LocalTime.now());
System.out.println(date1);
System.out.println(date2);
System.out.println(date3);
}
}
//下午
//下午
//17
2. 添加Stream.toList方法
现在我们可以使用Collectors.toList 和Collectors.toSet来减少一些模板代码:
List<String> integersAsString = Arrays.asList("1", "2", "3");
//之前这样写
List<Integer> ints = integersAsString.stream().map(Integer::parseInt).collect(Collectors.toList());
//现在可以这样写
List<Integer> intsEquivalent = integersAsString.stream().map(Integer::parseInt).toList();
3. instanceof的模式匹配
之前:
Object obj = "大阳";
if (obj instanceof String) {
String t = (String) obj;
// TODO
}
现在:
Object obj = "大阳";
if (obj instanceof String t) {
// TODO
}
4. 密封类(第二次预览版)
密封的类和接口限制了其他类或接口可以扩展或实现它们
public sealed interface Shape{
final class Planet implements Shape {}
final class Star implements Shape {}
final class Comet implements Shape {}
}
public abstract sealed class Test{
final class A extends Test {}
final class B extends Test {}
final class C extends Test {}
}
5. record纪录类(标准版)
传统的Java应用程序通过创建一个类,通过该类的构造方法实例化类,并通过getter和setter方法访问成员变量或者设置成员变量的值。有了record关键字,你的代码会变得更加简洁。
package cn.dayangshuo;
/**
* 普通的dto
* @author DAYANG
*/
public class NormalEntity {
public static void main(String[] args) {
//传统的方式
User1 user1 = new User1("大阳", 1990);
System.out.println(user1);
//reocrd 记录类
User2 user2 = new User2("大阳", 1990);
System.out.println(user2);
}
}
/**
* 成员变量都是固定的
*/
class User1 {
String name;
Integer age;
public User1(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User1[" +
"name='" + name + '\'' +
", age=" + age +
']';
}
}
package cn.dayangshuo;
/**
* record 记录类
* 你也可以覆写equals() hashCode() toString()方法
* @author DAYANG
*/
record User2(String name, Integer age) {
@Override
public String toString() {
return "User2[" +
"name='" + name + '\'' +
", age=" + age +
']';
}
@Override
public boolean equals(Object obj) {
return false;
}
@Override
public int hashCode() {
return 0;
}
}