Java8之后的新特性学习
2022-08-09 本文已影响0人
盼旺
都是自己感觉能用的,不是很全的哦
https://www.wdbyte.com/java/java-17/# Java9
接口中使用私有方
public interface TestInterface {
String test();
// 接口默认方法
default String defaultTest() {
pmethod();
return "default";
}
private String pmethod() {
System.out.println("private method in interface");
return "private";
}
}
提供了新的 API 用来创建不可变集
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("A", "B", "C");
Map<String, String> map = Map.of("KA", "VA", "KB", "VB");
改进 try-with-resources
Java 9 中不需要在 try 中额外定义一个变量。Java 9 之前需要这样使用 try-with-resources:
InputStream inputStream = new StringBufferInputStream("a");
try (InputStream in = inputStream) {
in.read();
} catch (IOException e) {
e.printStackTrace();
}
在 Java 9 中可以直接使用 inputStream 变量,不需要再额外定义新的变量了。
InputStream inputStream = new StringBufferInputStream("a");
try (inputStream) {
inputStream.read();
} catch (IOException e) {
e.printStackTrace();
}
增强了钻石操作符 "<>"可以自动做类型推导
Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
}
在 Java 9 中,可以自动做类型推
Handler<? extends Number> intHandler1 = new Handler<>(2) {
}
Java 10
新增局部类型推断 var
var a = "aa";
System.out.println(a);
var 关键字目前只能用于局部变量以及 for 循环变量声明中。
Java 11
Lambda 表达式中使用 var
(var x, var y) -> x.process(y)
字符串 API 增强
判断字符串是否为空白
" ".isBlank(); // true
// 去除首尾空白
" Javastack ".strip(); // “Javastack”
// 去除尾部空格
" Javastack “.stripTrailing(); // " Javastack”
// 去除首部空格
" Javastack ".stripLeading(); // "Javastack "
// 复制字符串
“Java”.repeat(3);// “JavaJavaJava”
// 行数统计
“A\nB\nC”.lines().count(); // 3
Optional 加强
Opthonal 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。
Optional.of(“javastack”).orElseThrow(); // javastack
Optional.of(“javastack”).stream().count(); // 1
Optional.ofNullable(null).or(() -> Optional.of(“javastack”)).get(); // javastack
// of方法中如果传入的参数是null, 会抛出空指针异常
//Optional<String> optional = Optional.of(null);
// ofNullable可以兼容空指针, 但是实际传入null后要小心
Optional<Object> optional = Optional.ofNullable(null);
Object object = optional.orElse("abc"); // 如果内部引用为空, 则返回参数中的引用, 否则返回内部引用
System.out.println(object);
Object object2 = optional.orElseThrow();
System.out.println(object2);
InputStream 加强
transferTo,可以用来将数据直接传输到 OutputStream
var cl = this.getClass().getClassLoader();
try (var is = cl.getResourceAsStream("file"); var os = new FileOutputStream("file2")) {
is.transferTo(os); // 把输入流中的所有数据直接自动地复制到输出流中
}
Java 12
switch 不仅可以作为语句,也可以作为表达式
private String switchTest(int i) {
return switch (i) {
case 1 -> "1";
default -> "0";
};
}
java14 没有break
String adjacentColor = switch (color) {
case Blue, Green -> "yellow";
case Red, Purple -> "blue";
case Yellow, Orange -> "red";
default -> "Unknown Color";
};
数字格式
NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.LONG);
System.out.println( fmt.format(100) );
System.out.println( fmt.format(1000) );
System.out.println( fmt.format(10000) );
System.out.println( fmt.format(100000) );
NumberFormat fmtShort = NumberFormat.getCompactNumberInstance(Locale.US,NumberFormat.Style.SHORT);
System.out.println( fmtShort.format(100) );
System.out.println( fmtShort.format(1000) );
System.out.println( fmtShort.format(10000) );
System.out.println( fmtShort.format(100000) );
100
1 thousand
10 thousand
100 thousand
100
1K
10K
100K
Java14
instanceof的模式匹配
Object o = new Person("Tom", "18");
//老的方式
if(o instanceof Person) {
Person p = (Person) o;
System.out.println(p);
}
//java14实现方式
if(o instanceof Person p) {
System.out.println(p);
}
public boolean test(Person person) {
Object obj = new Person("Tom", "18");
return obj instanceof Person p && person.equals(obj);
}
文本块
String text = """
select t.* from test t \
where t.a = 1 and t.b = 1\s\
and exist (\s\
select 1 from test1 t2 where t2.a = t.a and t2.b = t.b\s\
)
""";
System.out.println(text)
record
record类型已在Java 14中作为预览函数引入,并且将用作在类和应用程序之间进行数据传输的普通不可变数据类。
像enum一样,record也是Java中的一种特殊的类类型。它旨在用于仅创建类以充当纯数据载体的地方。
class和record之间的重要区别在于,Record记录旨在消除设置和从实例获取数据所需的所有代码。Record将这种责任转移到java编译器,该编译器生成构造函数,字段getter,hashCode()和equals()以及toString()方法。
public record EmployeeRecord(Long id,
String firstName,
String lastName,
String email,
int age) {
}
EmployeeRecord e1 = new EmployeeRecord
(1l, "Lokesh", "Gupta", "howtodoinjava@gmail.com", 38);
System.out.println(e1.id());
System.out.println(e1.email());
System.out.println(e1);
接受所有字段的构造函数。
toString()方法,用于打印Record中所有字段的状态/值。
使用基于invokedynamic的机制的equals()和hashCode()方法。
其名称类似于字段名称的getter方法,即id(),firstName(),lastName(),email()和age()。
类扩展了java.lang.Record,它是所有Record的基类。这意味着Record不能扩展其他类。
该类被标记为final,这意味着无法创建它的子类。
它没有任何setter方法,这意味着Record实例被设计为不可变的。
Java15
封闭类sealed
public abstract sealed class Student
permits ZhangSan, LiSi, ZhaoLiu {
...
}
类 Student 被 sealed 修饰,说明它是一个封闭类,并且只允许指定的 3 个子类继承
Java17
增强的伪随机数生成器
// 使用 Random
RandomGeneratorFactory<RandomGenerator> l128X256MixRandom = RandomGeneratorFactory.of("Random");
// 使用时间戳作为随机数种子
RandomGenerator randomGenerator = l128X256MixRandom.create(System.currentTimeMillis());
for (int i = 0; i < 5; i++) {
System.out.println(randomGenerator.nextInt(10));
}