一、接口中可以声明私有方法 (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)
-
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
方法重载。
-
takeWhile
和dropWhile
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);
-
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
-
Stream.iterate()
方法重载,可以传入一个Predicate
,当元素满足判定条件时继续迭代操作,不满足时终止操作。
// 当元素大于等于1000时终止
Random random = new Random();
Stream.iterate(0, t -> t < 1000, t -> t + random.nextInt(200) - 90).forEach(System.out::println);
- 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);