Java11 新特性

一、接口中可以声明私有方法 (java9)

在java9中,接口中可以声明私有方法,接口中的私有方法是对接口中default方法中公共代码的抽取,接口中的私有方法必须给出相应的实现,可以在接口default方法或者static方法中调用私有方法。

public interface Inter {

   String STATIC_TIP_PREFIX = "static_tip: ";    // java8 静态变量

   static String getTipStatic() {      // java8 接口中的静态方法
      return getTipStaticPrefix() + "晚安,玛卡巴卡";
   }

   private static String getTipStaticPrefix() {  // java9 接口中的私有方法
      return STATIC_TIP_PREFIX;
   }

   default String getTip() {    // java8 接口中的默认方法
      return getTipPrefix() + "hello Java9";
   }

   private String getTipPrefix() {  // java9 j接口中的私有方法
      return "tip: ";
   }
}

Inter inter = new Inter() { };
System.out.println(Inter.getTipStatic());  // static_tip: 晚安,玛卡巴卡
System.out.println(inter.getTip());  // tip: hello Java9

二、集合中的新API - 不可变集合 (java9)

  1. of方法,集合中添加了of方法,可以使我们更方便的创建出集合
List ofList = List.of("喜洋洋", "JOJO", "DIO", "蕾姆", "乌尔奇奥拉");
System.out.println(ofList .getClass());    // class java.util.ImmutableCollections$ListN
Map ofMap = Map.of("name", "喷火龙", "age", 18);
System.out.println(ofMap.getClass());   // class java.util.ImmutableCollections$MapN

需要注意的是创建出的集合都是不可变的,这以为这我们只能读集合中的元素,不能向集合中添加元素,否则会抛出UnsupportedOperationException.

三、输入流转输出流 (java9)

java9中在InputStream中提供了transferTo方法,可以直接将输入流转为输出流。

@Cleanup InputStream inputStream = new FileInputStream("D:/hello.txt");
@Cleanup OutputStream outputStream = new FileOutputStream("D:/hello2.txt");
inputStream.transferTo(outputStream);    // 从D:/hello.txt中读取到内存中,再写入到D:/hello2.txt中

四、stream流中新增方法 (java9)

stream流中新增了四个方法:takeWhile, dropWhile, ofNullable, iterate方法重载。

  1. takeWhiledropWhile
List list = List.of(12, 43, 53, 63, 13, 63, 74, 34, 64, 73, 12, 16);

// 1. takeWhile: 遍历流,直到找到不满足条件的元素,终止遍历,返回之前的所有元素
// 找到流中不能被8整除的元素,如果出现不符合条件的元素,则终止操作,即使后面有符合条件的元素
list.stream().takeWhile(e -> e % 8 != 0).forEach(System.out::println);

//2. dropWhile: 遍历流,删除符合条件的元素,直到找到不满足条件的元素,返回流中剩余的元素
// 删除不能被8整除的元素,如果出现不符合条件的元素,则终止操作,返回剩余的元素
list.stream().dropWhile(e -> e % 8 != 0).forEach(System.out::println);
  1. Stream.of(T... values)方法中,如果传入的值为null,则会抛出空指针异常,因为源码中会调用计算数组长度的方法。java9中新增了Stream.ofNullable(T... values)方法,即使传入的值为null,也不会抛出空指针异常。
Stream.ofNullable(null).forEach(System.out::println);    // 不会出现NPE
Stream.of(null).forEach(System.out::println); // NPE
  1. Stream.iterate()方法重载,可以传入一个Predicate,当元素满足判定条件时继续迭代操作,不满足时终止操作。
// 当元素大于等于1000时终止
Random random = new Random();
Stream.iterate(0, t -> t < 1000, t -> t + random.nextInt(200) - 90).forEach(System.out::println);
  1. Optional中也可以使用Stream获取一个流。
Optional> optionalList = Optional.ofNullable(list);
 optionalList.stream().flatMap(List::stream).forEach(System.out::println);

五、局部变量类型推荐推断(java 10):

java11中引入了var语法声明,可以自动推断出变量的类型。

var str = "这是var";  
System.out.println(str); // 这是var
System.out.println(str.getClass());  // class java.lang.String

var list = new ArrayList();
list.add("小脑斧"); 
System.out.println(list); // [小脑斧]
System.out.println(list.getClass());  // class java.util.ArrayList

var不是java的关键字,下面语句不会报语法错误:

var var = 10

注意var不能推断出未声明的泛型。如下代码:

var strList = new ArrayList<>();
list2.add("zxc");

此时strList的类型为ArrayList而并非ArrayList

六、集合cpoyOf方法 (java10)

集合中新增了copyOf方法,返回一个只读集合。

List list = new ArrayList<>();
list.add(1);
list.add(10);
list.add(14);
List copyList = List.copyOf(list);
System.out.println(copyList);    // [1, 10, 14]
System.out.println(copyList.getClass());  // class java.util.ImmutableCollections$ListN

七、新增字符串方法

String str = "\t\t\n  xxxxccccczzzz\n\n\t\t";
String blank = "\t\t\t\n\n\n  ";
String repeatStr = "玛卡巴卡";
String lines = "百日依山尽\n"
        + "黄河入海流\n"
        + "欲穷千里目\n"
        + "更上一层楼";
/* isBlank() 判断是否是空白 */
System.out.println(blank.isBlank());
/* strip() 去除首尾的空白 */
System.out.println("@@@" + str.strip() + "@@@");
/* stripLeading() 去除首部空白 */
System.out.println("@@@" + str.stripLeading() + "@@@");
/* stripTrailing() 去除尾部空白 */
System.out.println("@@@" + str.stripTrailing() + "@@@");
/* repeat(Integer count) */
System.out.println(repeatStr.repeat(3));

/* lines() 相当于 [string].split('\n').stream(),按行分割转为Stream流 */
lines.lines().forEach(System.out::println);

八、Optional加强

Optional> optional = Optional.ofNullable(null);
// 判读value是否为null (java11)
System.out.println(optional.isEmpty());

// 参数为非空,执行参数一功能,如果value为空,执行参数二功能 (java9)
optional.ifPresentOrElse(e -> {
   System.out.println(String.join("-", e));
}, () -> {
   System.out.println("这个值是空的");
});

// 如果参数为非空,返回之前的Optional,如果为空,返回给定的Optional (java9)
Optional> opTest = optional.or(() -> Optional.of(new ArrayList<>()));

// 如果参数为空,抛出给定的异常 (java10)
optional.orElseThrow(IllegalArgumentException::new);

你可能感兴趣的:(Java11 新特性)