美文网首页
Java8之后的新特性学习

Java8之后的新特性学习

作者: 盼旺 | 来源:发表于2022-08-09 13:57 被阅读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));
    }
    

    相关文章

      网友评论

          本文标题:Java8之后的新特性学习

          本文链接:https://www.haomeiwen.com/subject/tvhnwrtx.html