java9
语法改进:接口的私有方法
Java 8中规定接口中的方法除了抽象方法之外,还可以定义静态方法和默认方法。一定程度上,扩展了接口的功能,此时的接口更像是一个抽象类。
在Java 9中,接口更加的灵活和强大,连方法的权限修饰符都可以声明为private的了,此时方法将不会称为你对外暴露API的一部分。
public interface MyInterface{
//如下的三个方法修饰符都是public
void methodAbstract();
static void methodStatic(){
System.out.println("我是接口中的静态方法");
}
default void methodDefault(){
System.out.println("我是接口中的默认方法");
}
//jdk9中允许接口中定义私有的方法
private void methodPrivate(){
System.out.println("我是接口中的私有方法");
}
}
public class MyInterfaceImp implements MyInterface{
@Override
public void methodAbstract(){
}
@Override
public void methodDefault(){
System.out.println("实现类实现了接口中的默认方法")
}
public static void main(String[] args){
//接口中的静态方法只能由接口自己调用,接口的实现类不能调用接口的静态方法
MyInterface.methodStatic();
MyInterfaceImpl impl = new MyInterfaceImpl();
impl.methodDefault();
//私有方法不能调用
//impl.methodPrivate();
}
}
钻石操作符使用升级
我们将能够与匿名实现类共同使用钻石操作符(diamond operator)在Java8中如下操作时会报错的:
Comparator<Object> com = new Comparator<>(){
@Override
public int compare(Object o1,Object o2){
return 0;
}
}
try语句
Java8中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过,如下例所示:
//java8中资源关闭操作
try(InputStreamReader reader = new InputStreamReader(System.in)){
//读取数据细节省略
}catch(IOException e){
e.printStackTrace();
}
//Java9中资源关闭操作
//此时的资源属性是常量
InputStreamReader reader = new InputStreamReader(System.in);
try(read){
//读取数据细节省略
}catch(IOException e){
e.printStackTrace();
}
String存储结构的变更
Java8用的是char[]
,java9用的是byte[]
集合工厂方法:创建只读集合
//java8的写法
List<String> namesList = new ArrayList<>();
namesList.add("joe");
namesList.add("Bob");
namesList.add("Bill");
namesList = Collections.unmodifiableList(nameList);
System.out.println(namesList);
//此时集合只是一个只读集合
List<Integer> list = Arrays.asLisst(1,2,3,4);
//java9
List<Integer> list11 = List.of(1,2,3,4,5);
InputStream加强
transferTo:可以用来将数据直接传输到OuptputStream,这是在处理原始数据流时非常常见的一种观念用法
ClassLoader c1 = this.getClass().getClassLoader();
try(InputStream is = c1.getResourceAsStream("hello.txt");OutputStream os = new FileOutPutStream("src\\hello.txt")){
is.transferTo(os);
}catch(IOException e){
e.printStackTrace();
}
增强的StreamAPI
//takeWhile()的使用:返回从开头开始的按照指定规则尽量多的元素
List<Integer> list = Arrays.asList(23,43,35,543,23,45,334);
list.stream().takeWhile(x->x<60).forEach(System.out::println);
//dropWhile()的使用:返回剩余的元素
list.stream().dropWhiele(x0>x<60).forEach(System.out::println);
//ofNullable()使用
//java8中Stream不能完全为null,否则会报空指针异常。而java9中的ofNullable方法允许我们创建一个单元素Stream,可以包含一个非空元素,也可以创建一个空的Stream
//of()参数中的多个元素,可以包含null值
Stream<Integer> stream1 = Stream.of(1,2,3,null);
stream1.forEach(System.out::println);
//of()参数不能只存储单个null值,否则报异常
//ofNullable():形参变量是可以为null值得单个元素
Integer i = 10;
i = null;
Stream<Integer> stream 3 = Stream.ofNullablle(i);
//java8
Stream.iterate(0,x->x+1).limit(10).forEach(System.out::print);
//java9 添加终止条件
Stream.iterate(0,x->x<100,x->x+1).forEach(System.out::println);
Optional获取Stream
List<String> list = new ArrayList<>;
list.add("Tom");
list.add("Jerry");
list.add("Tim");
Optional<List<String>> optional = Optional.ofNullable(list);
Stream<List<String>> stream = option.stream();
stream.flatMap(x->x.stream()).forEach(System.out::println);
java10 特性
局部变量类型推断
不适用得情况
初始值为null,方法引用,Lambda表达式,为数组静态初始化
var num = 10;
var list = new ArrayList<>(Integer);
for(var i : list){
System.out.println(i);
}
集合中新增copyOf(),用于创建一个只读的集合
var list1 = List.of("java","python","c");
var copy1 = List.copyOf(list1);
System.out.println(list1==copy1);//true
var list2 = new ArrayList<String>();
list2.add("aaa")
var copy2 = List.copyOf(list2);
System.out.print(list2==copy2);//false
//copyOf(Xxx coll):如果参数coll本身就是一个只读集合,则copyOf()返回值即为只读集合,如果参数coll不是一个只读集合,则copyOf()返回一个新的集合,这个集合是只读的
java11新特性:GC
String中新增的方法
isBank():判断字符串是否为空
strip():去除首尾空格
stripTrailing():去除尾部的空格
stripLeading():去除首部的空格
repeat():复制字符串
lines().count():行数统计
Optional加强
新增方法:
boolean isEmptly():判断value是否为空 11
ifPresentOrElse(Consumer<? super T> action,Runnable emptyAction)
:value非空执行参数1 功能,如果value为空执行参数2功能 9
Optional<T> or(Supplier<? extends Optional<? extends T>> supplier
:value非空,返回对应的Optional;value为空返回形参封装的Optional 9
Stream<T> stream()
:value非空,返回仅包含此value的Stream,否则返回一个空的Stream 9
T orElseThrow():value非空,返回value;否则抛异常NoSuchEmelmentException 10
var op = Optional.empty();
op = Optional.of("abc");
Optional<String> op1 = Optional.of("hello");
op.or(()->op1);
局部类型推断升级
//错误的形式:必须要有类型,可以加上var
//Consumer<String> con1 = (@Deprecated t)-> System.out.println(t.toUpperCase());
//正确的形式
//使用var的好处是在使用lambda表达式时给参数加上注解
Consumer<String> con2 = (@Deprecated var t) ->System.out.println(t.toUpperCase);