java10 新特性1 : 局部变量的类型推断 var
package com.atguigu.java1;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* @author liangqichen
* @create 2021-11-06 10:05
*/
public class Java10Test {
/*
java10 新特性1 : 局部变量的类型推断 var
*/
@Test
public void test1() {
// 1. 声明变量时,根据所附的值,推断变量的类型
var number = 10;
var list = new ArrayList<Integer>();
list.add(123);
// 2. 遍历操作
for (var i : list) {
System.out.println(i.getClass()); // class java.lang.Integer
}
// 3. 普通的遍历操作
for (var i = 0; i < 100; i++) {
System.out.println(i);
}
}
@Test
public void test2() {
// 1. 局部变量不赋值,就不能实现类型推断
// var num; 错误
var num = "hello";
System.out.println(num.getClass()); // class java.lang.String
// 2. lambda表达式中。左边的函数式接口,不能声明为var
// Supplier<Double> sup =() -> Math.random();
Supplier<Double> sup = () -> Math.random();
// 3. 方法引用中,左边的函数式接口,不能声明为var
Consumer<String> con = System.out::println;
// var con = System.out::println;
// 4. 数组,静态初始化中,注意左侧不可以省略
int[] arr = new int[]{1, 2, 3, 4};
var arr1 = new int[]{1, 2, 3, 4};
}
@Test
public void test3() {
// 情况1:没有初始化的局部变量声明 var s; var s = null;
// 情况6:catch块
// try {
//
// }catch (var e){
// e.printStackTrace();
// }
}
// 情况2:方法的返回类型 不能用var
public int method1() {
return 0;
}
// 情况3:方法的参数类型
public void method2(int number) { // 不能用var
}
// 情况4:构造器的参数类型
// public Java10Test(var i){
//
// }
// 情况5:属性
// var num = 10;
@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 (Exception e) {
e.printStackTrace();
}
}
// java10 新特性2:集合中,新增的copyof 用于创建一个只读的集合
@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<String>();
var copy2 = List.copyOf(list2);
System.out.println(list2 == copy2); // false
//示例1和2代码基本一致,为什么一个为true,一个为false?
// 结论: copyOf(Xxx coll) : 如果参数coll本身就是一个只读集合,则copyOf()返回值即为当前的coll
//如果参数coll不是一个只读集合,则copyOf() 返回一个新的只读集合,这个集合是只读的
}
}