java9
语法改进:接口的私有方法
Java 8中规定接口中的方法除了抽象方法之外,还可以定义静态方法和默认方法。一定程度上,扩展了接口的功能,此时的接口更像是一个抽象类。
在Java 9中,接口更加的灵活和强大,连方法的权限修饰符都可以声明为private的了,此时方法将不会称为你对外暴露API的一部分。
| public interface MyInterface{ |
| |
| |
| void methodAbstract(); |
| |
| static void methodStatic(){ |
| System.out.println("我是接口中的静态方法"); |
| } |
| |
| default void methodDefault(){ |
| System.out.println("我是接口中的默认方法"); |
| } |
| |
| 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(); |
| |
| |
| } |
| } |
钻石操作符使用升级
我们将能够与匿名实现类共同使用钻石操作符(diamond operator)在Java8中如下操作时会报错的:
| Comparator<Object> com = new Comparator<>(){ |
| @Override |
| public int compare(Object o1,Object o2){ |
| return 0; |
| } |
| } |
try语句
Java8中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过,如下例所示:
| |
| try(InputStreamReader reader = new InputStreamReader(System.in)){ |
| |
| }catch(IOException e){ |
| e.printStackTrace(); |
| } |
| |
| |
| InputStreamReader reader = new InputStreamReader(System.in); |
| try(read){ |
| |
| }catch(IOException e){ |
| e.printStackTrace(); |
| } |
| |
String存储结构的变更
Java8用的是char[]
,java9用的是byte[]
集合工厂方法:创建只读集合
| |
| 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); |
| |
| |
| List<Integer> list11 = List.of(1,2,3,4,5); |
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
| |
| List<Integer> list = Arrays.asList(23,43,35,543,23,45,334); |
| list.stream().takeWhile(x->x<60).forEach(System.out::println); |
| |
| list.stream().dropWhiele(x0>x<60).forEach(System.out::println); |
| |
| |
| |
| Stream<Integer> stream1 = Stream.of(1,2,3,null); |
| stream1.forEach(System.out::println); |
| |
| |
| Integer i = 10; |
| i = null; |
| Stream<Integer> stream 3 = Stream.ofNullablle(i); |
| |
| Stream.iterate(0,x->x+1).limit(10).forEach(System.out::print); |
| |
| 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); |
| |
| var list2 = new ArrayList<String>(); |
| list2.add("aaa") |
| var copy2 = List.copyOf(list2); |
| System.out.print(list2==copy2); |
| |
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); |
局部类型推断升级
| |
| |
| |
| |
| Consumer<String> con2 = (@Deprecated var t) ->System.out.println(t.toUpperCase); |
编译和运行合为一个 java javatest.java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?