最新的java11已经上线,快来看看

听说Java 11支持Java 9和Java 10并且其扩展支持到2026年,那么Java 9-Java11有啥子好用让人称赞的特性呢?

一、集合加强(Java9)

Java9中为(List、set、Map)集合都添加了of和copy of方法,可用来创建不可变的集合。

/**
copyOf方法会先判断源集合是不是AbstractImmutableList类型的,如果是就直接返回,否则就调用of创建一个新的集合。
*/
var list = List.of("香蕉","桃子","玉露琼浆");
var copy = List.copyOf(list);
sout(list ==copy);//true

/**
因为是用的new创建的集合,不属于不可变的AbstractImmutableList类的子类,copyOf直接创建了一个新的实例,所以false啦。
*/
var list = new ArrayList<String>();
var copy2 = List.copyOf(list);
sout(list ==copy);//false

注意:使用 of 和 copyOf 创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。

二、Stream加强

//1、增加单个参数构造方法,可为null
Stream.ofNullable(null).count();//0
//2、增加takeWhile和dropWhile方法,takeWhile 当达到一定条件就结束 结果:[1,2]
Stream.of(1,2,3,2,1).takeWhile(n->n<3).collect(Collectors.toList());
//一旦n<3不成立就计算
Stream.of(1,2,3,2,1).dropWhile(n->n<3).collect(Collectors.toList());

//3、iterage重载
//原来控制终止方式
Stream.iterate(1,i->i+1).limit(10).forEach(System.out::println);
//现在终止方式
Stream.iterate(1,i->i<100,i->i+1).forEach(System.out::println);

三、本地变量类型推断(Java10)

var javastack = "javastack";
sout(javastack);
/**
局部变量类型推断是使用var定义,不写具体类型,编译器能够根据右边的表达式自动推断类型。
我滴个乖乖,var 可是js 的变量,java 咋还看上了,还那么强能够推断出类型,真心好,强语言开始能够自我识别了,但是只是语法糖,是局部变量使用的,如下:而不能是类成员变量类型,不能是方法返回类型,Lambda表达式。
*/
//在接收方法返回值定义局部变量
private static void testMethod(){
    var javastack = getJavaStack();
    sout(javastack);

}
public static String getJavastack(){
  return "javastack";
}
//循环体中定义局部变量
private static void testLoop(){
    for(var i= 0 ; i<3;i++){
        for (var m = 100;m<15;m++){
         sout(i+m);    
        
        }
    }
}
//泛型结合局部变量
private static void testLoop(){
  //<>从jdk1.7开始不用带具体类型,在接口中指明
  List <String> list1 = new ArrayList<>();
  
  //<>里面是Object,可以添加任意类型
   var list2 = new Array<>();
  list2.add(2018);

  //<>强制使用String来指定泛型
  var list3 = new ArrayList<String>();
   list3.add("javastack");
 }

四、字符串加强(Java 11)

// 判断字符串是否为空白
" ".isBlank(); // true

// 去除首尾空格
" Javastack ".strip(); // "Javastack"

// 去除尾部空格 
" Javastack ".stripTrailing(); // " Javastack"

// 去除首部空格 
" Javastack ".stripLeading(); // "Javastack "

// 复制字符串
"Java".repeat(3); // "JavaJavaJava"

// 行数统计
"A\nB\nC".lines().count(); // 3

五、Optional加强(求带)

Optional新增方法使得当一个空Optional时可以替代,还有很方便将一个Optional转换为Stream的方法

Optional.of("javastack").orElseThrow();//javastack
Optional.of("javastack").stream().count();//1
OPtional.ofNullable(null).or(()->OPtional.of("javastack")).get();//javastack

六、InputStream加强

InputStream添加一个transferTo,可以用来将数据直接传输到OutputStream

var classLoader = ClassLoader.getSystemClassLoader();
var inputStream = classLoader.getResourceAsStream("javastack.txt");
var javastack = File.creatTemFile("javastack2","txt");
try (var outputStream = new FileOutputStream(javastack)) {
    inputStream.transferTo(outputStream);
}

七、HTTP Client API

 Java 11将Java9的HTTP Client API放在了java.net包下面了,已经可以使用,该API支持同步和异步。

var request = HttpRequest.newBuilder()
    .uri(URI.create("https://javastack.cn"))
    .GET()
    .build();
var client = HttpClient.newHttpClient();

// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

// 异步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);

八、一个java命令搞定编译运行

//之前先编译,后运行
javac  JavaCompliteRun.class
java  JavaCompliteRun

//java 11中
java JavaCompliteRun.java

九、其他新特性如下图

猜你喜欢

转载自blog.csdn.net/LCF_lxf_ldy/article/details/82875741