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));
}
上一篇下一篇

猜你喜欢

热点阅读