jdk-17

1. switch的模式匹配 (instanceof-and-cast)

  • if

    static String formatter(Object o) {
        String formatted = "unknown";
        if (o instanceof Integer i) {
            formatted = String.format("int %d", i);
        } else if (o instanceof Long l) {
            formatted = String.format("long %d", l);
        } else if (o instanceof Double d) {
            formatted = String.format("double %f", d);
        } else if (o instanceof String s) {
            formatted = String.format("String %s", s);
        }
        return formatted;
    }
    
  • switch 重写

    static String formatterPatternSwitch(Object o) {
         return switch (o) {
             case Integer i -> String.format("int %d", i);
             case Long l    -> String.format("long %d", l);
             case Double d  -> String.format("double %f", d);
             case String s  -> String.format("String %s", s);
             default        -> o.toString();
         };
    }
    
  • 模式匹配和null

    static void testFooBar(String s) {
          switch (s) {
              case null         -> System.out.println("Oops");
              case "Foo", "Bar" -> System.out.println("Great");
              default           -> System.out.println("Ok");
          }
    }
    
  • String s将匹配 null值和所有String值:

    static void testStringOrNull(Object o) {
        switch (o) {
            case null, String s -> System.out.println("String: " + s);
        }
    }
    
  • 细化模式switch
    对模式的实验switch表明,想要改进模式是很常见的。考虑以下切换Shape值的代码:

    class Shape {}
    class Rectangle extends Shape {}
    class Triangle  extends Shape { int calculateArea() { ... } }
    
    static void testTriangle(Shape s) {
        switch (s) {
            case null:
                break;
            case Triangle t:
                if (t.calculateArea() > 100) {
                    System.out.println("Large triangle");
                    break;
                }
            default:
                System.out.println("A shape, possibly a small triangle");
        }
    }
    
    
  • static void testTriangle(Shape s) {
        switch (s) {
            case Triangle t && (t.calculateArea() > 100) ->
                System.out.println("Large triangle");
            case Triangle t ->
                System.out.println("Small triangle");
            default ->
                System.out.println("Non-triangle");
        }
    }
    
    

    描述
    switch我们通过两种方式增强语句和表达式:

    • 扩展case标签以包含除常量之外的模式,以及

    • 引入两种新的模式:保护模式和括号模式。


2. 增强型伪随机数发生器

JDK7为伪随机数生成器(PRNG)提供新的接口类型和实现,使程序使用各种PRNG算法更加容易,更好的支持流式编程。
提供了一个新的接口 RandomGenerator ,为所有PRNG算法提供统一的API,同时提供了一个新的类 RandomGeneratorFactory 来构造各种 RandomGenerator 实例。

public static void main(String[] args) {
    //生成10个10以内的随机数
    RandomGeneratorFactory<RandomGenerator> L128X1024MixRandom = RandomGeneratorFactory.of("L128X1024MixRandom");
    RandomGenerator randomGenerator = L128X1024MixRandom.create(System.currentTimeMillis());
    for (int i = 0; i < 10; i++) {
        System.out.println(randomGenerator.nextInt(10));
    }
}

RandomGeneratorFactory.all() 方法可以获得所有随机数生成算法,输出所有随机算法名称:

public static void main(String[] args) {
    RandomGeneratorFactory.all().forEach(e -> System.out.println(e.group() + "-" + e.name()));
}
LXM-L32X64MixRandom
LXM-L128X128MixRandom
LXM-L64X128MixRandom
Legacy-SecureRandom
LXM-L128X1024MixRandom
LXM-L64X128StarStarRandom
Xoshiro-Xoshiro256PlusPlus
LXM-L64X256MixRandom
Legacy-Random
Xoroshiro-Xoroshiro128PlusPlus
LXM-L128X256MixRandom
Legacy-SplittableRandom
LXM-L64X1024MixRandom

3. Sealed Classes(密封类) 转正

密封类(Sealed Classes)是JDK15引入的,在JDK17正式转正。
密封类可以对继承或者实现他们的类进行限制。

//Person类被 sealed 修饰,只允许(permits)Male和Female类继承,继承的类必须有 final 或者 no-sealed 来修饰。

//Function接口被 sealed 修饰,只允许(permits)Male和Female类实现,实现的类必须有 final 或者 no-sealed 来修饰

public static void main(String[] args) {
    Male male = new Male();
    male.eat();

    Female female = new Female();
    female.eat();
}

static sealed class Person permits Male, Female {
}

static final class Male extends Person implements Function {
    @Override
    public void eat() {
        System.out.println("eat 1");
    }
}

static non-sealed class Female extends Person implements Function {
    @Override
    public void eat() {
        System.out.println("eat 2");
    }
}

sealed interface Function permits Male, Female {
    void eat();
}

Function {
@Override
public void eat() {
System.out.println(“eat 2”);
}
}

sealed interface Function permits Male, Female {
void eat();
}


“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值