加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

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
无需定义变量类型,通过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 规范中指定的更多的扩展。
 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章