Java知识回顾 (18)Java 8、9、11的新特性
Java 8?Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。 ? 新特性 Java8 新增了非常多的特性,我们主要讨论以下几个:
更多的新特性可以参阅官网:What‘s New in JDK 8 详细的新特性:
? 排序的示例 // 使用 java 7 排序 private void sortUsingJava7(List<String> names){ Collections.sort(names,new Comparator<String>() { @Override public int compare(String s1,String s2) { return s1.compareTo(s2); } }); } // 使用 java 8 排序 private void sortUsingJava8(List<String> names){ Collections.sort(names,(s1,s2) -> s1.compareTo(s2)); } ? JAVA 9Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍 Java 9 的新特性。 新特性
更多的新特性可以参阅官网:What‘s New in JDK 9 详细的:
? Java 11美国时间 2018年09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年。Java 11 长期支持,也已经包含了 9 和 10 的全部功能,9 和 10 自然就活到头了。 ? 局部变量类型推断 var str = "我是刘zzz"; var list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add(233);//如果 new ArrayList<Strnig>规定的泛型是 String,就不能这么写了 list.forEach(s-> System.out.println(s)); lamada 语法 new Thread(()->{ for (int i=0; i<5; i++){ System.out.println(i); } }).start(); public interface Customer { void accpet(String str); } Customer customer = (var str1) -> System.out.println(str1.toUpperCase()); customer.accpet("sdflksjf"); ? 增强的方法 //集合的创建可以更简单,Set 也有 of() List<String> list1 = List.of("aa","bb","cc");//Arrays.asList() 效果一样 list1.add("dd");//java.lang.UnsupportedOperationException System.out.println(list1); Stream 流 /** * 流的处理的三个步骤 * 1,创建流 * 2,中间操作 * 3,终止操作 */ Stream<Integer> stream1 = Stream.of(1,10,3,20,30,50); //stream.forEach(t-> System.out.println(t)); stream1.forEach(System.out::println);//有参数无返回值 //如果为空不会报错,但传入null会报空指针, Stream<Object> stream2 = Stream.of();//Stream.of(null); stream2.forEach(System.out::println); //对于 null 的情况,可以用 ofNullable Stream<Object> stream3 = Stream.ofNullable(null); stream3.forEach(System.out::println); System.out.println("****************"); Stream<Integer> stream4 = Stream.of(1,5,50); //Stream<Integer> takeWhile = stream4.takeWhile(t -> t % 2 != 0);//为奇数时留下,形成新 Stream //takeWhile.forEach(System.out::println); Stream<Integer> dropWhile = stream4.dropWhile(t -> t % 2 != 0);//为奇数时丢弃,形成新 Stream dropWhile.forEach(System.out::println); //流的迭代,创建流 Stream<Integer> iterate = Stream.iterate(1,t -> (2 * t) + 1); //如果不加limit(10),会无限迭代输出,这是 jdk11 之前的做法(用 limit 限制) iterate.limit(10).forEach(System.out::println); //jdk 11 的做法 System.out.println("***************"); Stream<Integer> stream = Stream.iterate(1,t -> t < 1000,t -> (2 * t) + 1); stream.forEach(System.out::println); 字符串和 Operational String str1 = "t nr "; //判断字符串是否是空白字符 System.out.println(str1.isBlank()); System.out.println("*****==========="); str1 = "t abc r n "; //去除字符串首尾中的空白,包括英文和其它所有语言的空白字符 String strip = str1.strip(); //去除字符串首部的空白,包括汉字 String stripLeading = strip.stripLeading(); //去除字符串尾部的空白,包括汉字 String stripTrailing = strip.stripTrailing(); System.out.println(strip+"<====>"+strip.length()); str1 = "java"; str1.repeat(3);//把str1 重复三次,输出 javajavajava //去除字符串首尾中的空白,只能去除码值小于32的(如果是中文全角的空白是去除不了的) String trim = str1.trim(); System.out.println(trim+"<====>"+trim.length()); ? String str = null; //of 和 get() 都不建议用,如果传入的null,会报空指针 /**Optional<String> stringOptional = Optional.of(str); System.out.println(stringOptional.get());**/ //一般用 ofNullable,取值用 orElse() Optional<String> optionalS = Optional.ofNullable(str); //如果str不为null,返回str的内容,否则返回 "空串代替" String orElse = optionalS.orElse("空串代替"); ////如果 str 不为null,返回 str 的内容,否则执行 f() 方法 orElse = optionalS.orElse(f()); System.out.println(orElse); //orElse 和 orElseGet 区别:无论 str是否为空,orElse里面的都会执行,orElseGet 只有 str 为空才执行 String orElseGet = optionalS.orElseGet(() -> f()); System.out.println(orElseGet); //orElseThrow也有重载方法,跟orElseGet 用法类似.. String orElseThrow = optionalS.orElseThrow(); System.out.println(orElseThrow);//抛出 NoSuchElementException,底层还是空指针,不过源码做了控制而已 ? static String f(){ System.out.println("执行了f() 这个方法"); return "lhg"; } 字符串和输入流的 API 以前输入输出文件 FileInputStream fis = new FileInputStream("D:ideaProjectsDemo_JDK12srccomlhgdemoStringTest.java"); FileOutputStream fos = new FileOutputStream("d://demo.java"); BufferedReader br = new BufferedReader(new FileReader("D:ideaProjectsDemo_JDK12srccomlhgdemoStringTest.java")); BufferedWriter bw = new BufferedWriter(new FileWriter("d:/demo3.java")); byte[] buff = new byte[fis.available()];//fis.available():得到文件的有效字节数 int len;//读进缓冲数组里面 String line; //br bw方式 while ((line = br.readLine()) != null){ bw.write(line); bw.newLine(); } //fis fos 方式 while((len=fis.read(buff)) != -1){ fos.write(buff,0,len); } fos.close(); fis.close(); bw.close(); br.close(); 通过 Stream FileInputStream fis = new FileInputStream("D:ideaProjectsDemo_JDK12srccomlhgdemoStringTest.java"); byte[] buff = new byte[fis.available()];//fis.available():得到文件的有效字节数 int len;//读进缓冲数组里面 fis.close(); String string = new String(buff); string.lines().forEach(System.out::println);//可以直接输出或其它操作 transfer 复制流 InputStream is = StringTest.class.getClassLoader().getResourceAsStream("config.properties"); try(var os = new FileOutputStream("config_bak.properties")){ is.transferTo(os);//输入流的数据自动复制到输出流 } is.close(); Http 客户端 ? ? 更简化的编译运行程序 垃圾收集器改进 ?默认的 gc ? epsilon gc ? ?设置好后,重新运行上面那段代码,发现程序会因为堆空间不足很快退出 ? ?ZGC java 11 最为瞩目的特性没有之一 ? ? ? ? ? ? ? ? ? ? 参考 Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码 java 11 新特性 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |