Java SE 10 新增特性
发布时间:2023-04-15 11:25:36 所属栏目:教程 来源:
导读:无需定义变量类型,通过var关键字结合初始化的值,可以推测出变量类型
package git.snippets.jdk10;
/**
* 类型推断
*
* @author <a href="mailto:">Grey</a>
* @date 2022/8/17
* @since 10
*/
pu
package git.snippets.jdk10;
/**
* 类型推断
*
* @author <a href="mailto:">Grey</a>
* @date 2022/8/17
* @since 10
*/
pu
|
无需定义变量类型,通过var关键字结合初始化的值,可以推测出变量类型 package git.snippets.jdk10; /** * 类型推断 * * @author <a href="mailto:">Grey</a> * @date 2022/8/17 * @since 10 */ public class TypeRefEnhance { public static void main(String[] args) { var a = 2; // a表示int System.out.println(a); var b = "hello"; // b 表示String System.out.println(b); var date = new java.util.Date(); System.out.println(date); var obj = new Customer("Grey"); // 自定义对象 System.out.println(obj); var sum = new TypeRefEnhance().add(1, 23); System.out.println(sum); var var = 3; System.out.println(var); } public int add(int a, int b) { return a + b; } static class Customer { String name; public Customer(String n) { name = n; } @Override public String toString() { return "Customer{" + "name=" + name + '}'; } } } var 看似好用,但是请谨慎使用,比如 var x = someFunction() 是因为如果不追踪someFunction()方法的返回类型,读者就不可能知道x的类型。多年来,人们对动态类型语言提出了类似的抱怨。 所以,记住我们的目标是编写可读的代码。 在Java中,var是一个特殊的新类型,你仍然可以在你的代码的其他地方使用var,比如作为一个变量或类名。这使得Java能够与Java 10之前的代码保持向后兼容,所以如下定义是没问题的 var var = 3; 不可变集合 API 如下代码 package git.snippets.jdk10; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * 集合API增强 * * @author <a href="mailto:">Grey</a> * @date 2021/11/29 * @since 10 */ public class CollectionEnhance { public static void main(String[] args) { var vegetables = new ArrayList<>(List.of("brocolli", "Celery", "Carrot")); var unmodifiable = Collections.unmodifiableList(vegetables); vegetables.set(0, "Radish"); var v = unmodifiable.get(0); // 以下这行会报错 unmodifiable.set(0, "XXX"); System.out.println(v); System.out.println(unmodifiable); } } 根据Java 10中Collections的最新定义,unmodifiableList返回一个不可修改的视图集合。所以unmodifiable.set(0, "XXX");会直接报错 Exception in thread "main" java.lang.UnsupportedOperationException at java.base/java.util.Collections$UnmodifiableList.set(Collections.java:1308) at git.snippets.jdk10.CollectionEnhance.main(CollectionEnhance.java:22) Java 10增加了两个新的API来实现这一点,也就是说,创建完全不能修改的集合。 第一个API是copyOf,用来制作集合的不可修改的副本。 static void copyOftest() { var list = List.of("a", "b", "c"); var copyList = List.copyOf(list); list.add("d"); // 由于copyList是副本, 所以copyList不会受到list的影响,打印出[a,b,c] System.out.println(copyList); System.out.println(list); // 由于是不可变集合,所以这里会报错 copyList.add("d"); } 这与用Collections.unmodifiableList包装一个列表是不同的。 copyOf是创建副本(源集合改变不会影响副本集合),而Collections.unmodifiableList是生成视图(源集合改变会影响视图)。 第二个API为Stream包中的Collectors类增加的三个新方法。现在你可以使用toUnmodifiableList、toUnmodifiableSet和toUnmodifiableMap在生成一个不可修改的集合。代码如下 static void unmodifiedtest() { List<String> list = List.of("b", "a", "b", "c"); List<String> c1 = list.stream().collect(Collectors.toUnmodifiableList()); System.out.println(c1); // 会报错 // c1.add("c"); // System.out.println(c1); Set<String> c2 = list.stream().collect(Collectors.toUnmodifiableSet()); System.out.println(c2); // 会报错 // c2.add("a"); // System.out.println(c2); // 会报错 // c2.add("e"); // System.out.println(c2); } 注意,虽然这些方法的名字可能会让你想起Collections.unmodifiableList等,但这些新方法产生的是真正的不可修改的列表,而Collections.unmodifiableList则返回一个不可修改的视图。 Unicode 语言标签扩展 Java SE 10实现了最新的LDML 规范中指定的更多的扩展。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
