本文共 3111 字,大约阅读时间需要 10 分钟。
在处理 var时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行 推断,作为左边变量的类型,然后将该类型写入字节码当中
注 意public class Java10Test { /* java10新特性一:局部变量的类型推断 */ @Test public void test1() { //1.声明变量时,根据所附的值,推断变量的类型 var num = 10; var list = new ArrayList(); list.add(133); //2.遍历操作 for (var l : list) { System.out.println(l); System.out.println(l.getClass());//class java.lang.Integer } //3.普通的遍历操作 for (var i = 0; i < 100; i++) { System.out.println(i); } } @Test public void test2() { //1.局部变量不赋值,就不能实现类型推断// var num ; //2.lambda表示式中,左边的函数式接口不能声明为var Supplier sup = () -> Math.random(); System.out.println(sup.get());// var sup = () -> Math.random(); //3.方法引用中,左边的函数式接口不能声明为var Consumer con = System.out::println; con.accept("朴灿烈");// var con = System.out::println; //4.数组的静态初始化中,注意如下的情况也不可以 int[] arr = { 1, 2, 3, 4};// var arr = {1,2,3,4}; } //不适用以下情况 @Test public void test3() { // 情况1:没初始化的局部变量声明// var num; } // 情况2:方法的返回类型// public var method1(){ // return 0;// } // 情况3:方法的参数类型// public void method2(var num){ // System.out.println(num);// } // 情况4:构造器的参数类型// public Java10Test(var i){ // this.i = i;// } // 情况5:属性// var num; // 情况6:catch /* public void test4(){// try{//// }catch (var e){// e.printStackTrace();// } }*/ @Test public void test4() { try { var url = new URL("http://www.atguigu.com"); var connection = url.openConnection(); var reader = new BufferedReader( new InputStreamReader(connection.getInputStream())); } catch (IOException e) { e.printStackTrace(); } }
自 Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了 of (jdk9新增)和 copyOf (jdk10新增)方法,它们两个都用来创建不可变的集合,来看下它们的 使用和区别。
@Test public void test5 () { //示例1: var list1 = List.of("Java", "Python", "C"); var copy1 = List.copyOf(list1); System.out.println(list1 == copy1); // true //示例2: var list2 = new ArrayList(); list2.add("aaa"); var copy2 = List.copyOf(list2); System.out.println(list2 == copy2); // false //示例1和2代码基本一致,为什么一个为true,一个为false? //结论:copyOf(Xxx coll):如果参数coll本身就是一个只读集合,则copyOf()返回值即为当前的coll //如果参数coll不是一个只读集合,则copyOf()返回一个新的集合,这个集合是只读的。 }
转载地址:http://vtuki.baihongyu.com/