java9&10&11

发布时间 2023-05-31 12:49:55作者: 生活的样子就该是那样

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);

编译和运行合为一个 java javatest.java