Java8后 进阶特性集锦

自Java 8以后,随着新版本的发布,Java继续引入了多项新特性来进一步增强语言的表达力和功能。以下是一些Java 8之后版本中的进阶语法特性,包括示例代码:

  1. 局部变量类型推断 (Java 10):
    Java 10引入了var关键字,允许在局部变量声明时省略显式类型,由编译器推断变量的类型。这使得代码更简洁,特别是对于泛型代码。

    // 使用var进行局部变量类型推断
    var list = new ArrayList<String>(); // 推断为ArrayList<String>
    var stream = list.stream(); // 推断为Stream<String>
    
  2. 增强的switch表达式 (Java 12, 13增强):
    Java 12引入了对switch表达式的增强,允许它返回一个值,并且可以有更简洁的语法。Java 13进一步增强了这个特性,提供了更多的模式匹配能力。

    // 增强的switch表达式,需要--enable-preview在编译和运行时开启
    String day = "MON";
    var typeOfDay = switch(day) {case "MON", "TUE", "WED", "THU", "FRI" -> "Weekday";case "SAT", "SUN" -> "Weekend";default -> throw new IllegalArgumentException("Invalid day: " + day);
    };
    System.out.println(typeOfDay); // 输出:Weekday
    
  3. 文本块 (Java 13):
    Java 13添加了文本块(或多行字符串),它允许嵌入由三个双引号定界的多行字符串文字,简化了包含大量文本的字符串的处理。

    // 文本块示例,需要--enable-preview在编译和运行时开启
    String json = """{"name": "John","age": 30}""";
    System.out.println(json);
    
  4. Records (Java 14):
    Java 14引入了Records作为轻量级的数据载体,它简化了创建包含数据的不可变类的过程。每个record都会自动提供构造器、访问器、equals、hashCode和toString方法。

    // Record示例,需要--enable-preview在编译和运行时开启
    record Point(int x, int y) { }Point p = new Point(1, 2);
    System.out.println(p.x()); // 输出:1
    System.out.println(p.y()); // 输出:2
    
  5. Pattern Matching for instanceof (Java 16):
    Java 16增强了instanceof操作符,使其能够自动进行类型转换,简化了代码中的类型检查和转换。

    // Pattern Matching for instanceof 示例
    Object obj = "Hello, World!";
    if (obj instanceof String s) { // 自动转换成String类型System.out.println(s.toUpperCase()); // 输出:HELLO, WORLD!
    }
    
  6. Sealed Classes (Java 17):
    Java 17引入了密封类和接口,它们限制了其他类或接口可以扩展或实现的可能性。这为类层次结构引入了受控的多态性。

    // Sealed类示例,需要在编译和运行时开启预览特性
    public sealed class Shape permits Circle, Square {// 类定义
    }final class Circle extends Shape {// 类定义
    }non-sealed class Square extends Shape {// 类定义
    }
    
  7. Stream API的改进 (Java 9):
    Java 9对Stream API进行了增强,添加了新的方法,比如takeWhile, dropWhileofNullable

    // 使用takeWhile来获取满足条件的前缀子序列
    var numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
    var result = numbers.takeWhile(n -> n < 5).collect(Collectors.toList());
    System.out.println(result); // 输出 [1, 2, 3, 4]// 使用dropWhile来丢弃满足条件的前缀子序列
    var numbers2 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
    var result2 = numbers2.dropWhile(n -> n < 5).collect(Collectors.toList());
    System.out.println(result2); // 输出 [5, 6, 7, 8, 9]
    
  8. Optional类的改进 (Java 9):
    Java 9对Optional类进行了改进,添加了ifPresentOrElsestream方法。

    // 使用ifPresentOrElse对Optional值进行条件操作
    Optional<String> optionalValue = Optional.of("Hello");
    optionalValue.ifPresentOrElse(System.out::println, // 如果值存在,执行这个Consumer() -> System.out.println("Value not present") // 否则执行这个Runnable
    );// 使用stream将Optional转换为Stream
    Stream<String> stream = optionalValue.stream();
    
  9. HttpClient API (Java 11):
    Java 11引入了新的HTTP客户端API,它支持HTTP/2协议和WebSocket,并且比旧的HttpURLConnection更易用。

    // 使用新的HttpClient发送GET请求
    HttpClient httpClient = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://httpbin.org/get")).build();
    HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
    
  10. 垃圾回收器的改进:
    Java不断改进其垃圾回收器,包括G1、ZGC和Shenandoah GC,以提供更低的延迟和更好的性能。

    // 启用不同的垃圾回收器,通常是通过JVM启动参数进行配置
    // 例如,使用G1垃圾回收器
    // java -XX:+UseG1GC MyApp
    // 或者,使用ZGC垃圾回收器(在支持的平台上)
    // java -XX:+UseZGC MyApp
    
  11. 模块系统 (Java 9):
    Java 9引入了一个全新的模块系统(Jigsaw项目),它允许将应用程序划分为模块,以提供更好的封装性和依赖管理。

    // module-info.java文件定义了模块的名称和依赖
    module com.myapp {requires java.base;exports com.myapp.service;
    }
    
  12. 接口中的私有方法 (Java 9):
    Java 9允许在接口中定义私有方法和私有静态方法,这有助于接口中的方法共享代码。

    public interface MyInterface {private static String getDefaultGreeting() {return "Hello, World!";}default void greet() {String greeting = getDefaultGreeting();System.out.println(greeting);}
    }
    
  13. 嵌套的基于性能的优化 (Java 11):
    Java 11对嵌套类进行了一些基于性能的优化,包括对内部类和嵌套类的访问控制的改进。

    public class OuterClass {private String outerField = "Outer field";private static String staticOuterField = "Static outer field";class InnerClass {public void showFields() {System.out.println(outerField);System.out.println(staticOuterField);}}
    }
    
  14. String类的改进 (Java 11):
    Java 11对String类进行了增强,添加了一些新的实用方法,例如strip, stripLeading, stripTrailing, isBlank, lines, repeat.

    // String类新方法示例
    String multilineString = "This is\n \n a multiline\n string.";
    multilineString.lines().forEach(System.out::println); // 按行打印字符串
    String str = "  hello  ";
    System.out.println(str.strip()); // 去除首尾空白字符
    System.out.println(str.isBlank()); // 检查字符串是否为空白
    System.out.println("repeat".repeat(3)); // 重复字符串内容
    
  15. Files.readString 和 Files.writeString (Java 11):
    Java 11在Files类中添加了readStringwriteString方法,简化了文件内容的读写操作。

    // 使用Files.readString和Files.writeString
    Path filePath = Paths.get("example.txt");
    String content = "Hello, World!";
    Files.writeString(filePath, content); // 写入字符串到文件
    String result = Files.readString(filePath); // 从文件读取字符串
    System.out.println(result);
    
  16. Compact Number Formatting (Java 12):
    Java 12引入了紧凑型数字格式化,可以更容易地以短形式显示数字,例如“1千”代替“1000”。

    // Compact Number Formatting示例
    NumberFormat compactNumberFormat = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
    String formatted = compactNumberFormat.format(1000);
    System.out.println(formatted); // 输出: 1K
    
  17. Switch表达式 (Java 14):
    Java 14正式引入了switch表达式作为标准特性,用于返回值,并允许多个case标签共享相同的结果。

    // Switch表达式示例
    int month = 3;
    String quarter = switch (month) {case 1, 2, 3 -> "First Quarter";case 4, 5, 6 -> "Second Quarter";case 7, 8, 9 -> "Third Quarter";case 10, 11, 12 -> "Fourth Quarter";default -> throw new IllegalArgumentException("Invalid month: " + month);
    };
    System.out.println(quarter);
    
  18. JEP 359: Records (预览) (Java 14)JEP 384: Records (第二次预览) (Java 15):
    正式作为Java语言特性之前,Records在Java 14和15中作为预览特性出现,用于简化数据类的声明。

    // Record预览特性示例
    record User(String name, int age) { }
    User user = new User("Alice", 30);
    System.out.println(user.name()); // 输出: Alice
    
  19. 模式匹配的instanceof (Java 16):
    Java 16引入了模式匹配的instanceof,它增强了instanceof操作符,使得类型检查和类型转换更加简洁。

    // 模式匹配的instanceof示例
    Object obj = "Java";
    if (obj instanceof String s && s.length() > 2) {System.out.println(s)
    }
    
  20. 向量API (Incubator) (Java 16):
    Java 16引入了向量API作为Incubator模块,这是一个用于表达向量计算的API,可以充分利用现代处理器的SIMD(单指令多数据)指令。这个API仍在孵化阶段,意味着它在将来的版本中可能会有所变化。

    // 向量API示例(Incubator模块,可能需要添加--add-modules jdk.incubator.vector)
    IntVector vector = IntVector.fromArray(IntVector.SPECIES_256, new int[] {1, 2, 3, 4, 5, 6, 7, 8}, 0);
    IntVector addedVector = vector.add(vector);
    int[] resultArray = addedVector.toArray();
    System.out.println(Arrays.toString(resultArray)); // 输出:[2, 4, 6, 8, 10, 12, 14, 16]
    
  21. 外部函数和内存API (Incubator) (Java 16):
    Java 16引入了外部函数和内存API(Foreign Function & Memory API)作为Incubator模块,它提供了一个可以与本地代码更安全交互的API,此API在未来的版本中也可能会有所变化。

    // 外部函数和内存API示例(Incubator模块,可能需要添加--add-modules jdk.incubator.foreign)
    try (MemorySegment segment = MemorySegment.allocateNative(100)) {MemoryAddress baseAddress = segment.baseAddress();// 使用MemoryAddress进行内存操作
    }
    
  22. 强化的伪随机数生成器 (Java 17):
    Java 17增强了伪随机数生成器,提供了对多种新的随机数生成器的支持。

    // 使用强化的伪随机数生成器
    RandomGenerator generator = RandomGenerator.of("Xoshiro256PlusPlus");
    System.out.println(generator.nextInt());
    
  23. 模式匹配的switch (预览) (Java 17):
    Java 17引入了模式匹配的switch作为预览特性,这个特性在Java中引入了更复杂的模式匹配,能够简化代码并提高其可读性。

    // 模式匹配的switch示例(预览特性,可能需要添加--enable-preview)
    String formatted = switch (obj) {case Integer i -> String.format("int %d", i);case Long l -> String.format("long %d", l);case Double d -> String.format("double %f", d);case String s -> String.format("String %s", s);default -> obj.toString();
    };
    System.out.println(formatted);
    
  24. 密封类 (Sealed Classes) (Java 17):
    Java 17将密封类和接口引入为正式特性,它们限制了可以扩展或实现的类和接口的数量,这有助于提供更精确的类型系统。

    // 密封类特性示例
    public sealed interface Shape permits Circle, Rectangle {// 接口定义
    }public final class Circle implements Shape {// 类定义
    }public non-sealed class Rectangle implements Shape {// 类定义
    }
    
  25. 持久化的数据结构 (Java 18):
    Java 18引入了一些新的集合API,它们是持久化的,也就是说,它们在修改时不会更改原有的数据结构,而是创建新的结构。

    // 持久化数据结构示例
    List<Integer> list = List.of(1, 2, 3);
    List<Integer> newList = list.with(4); // 创建一个包含新元素的新列表
    System.out.println(newList); // 输出:[1, 2, 3, 4]
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat 的 work 目录缓存导致的JSP页面图片更新问题

一、问题分析 1. 修改后重新部署没有变化 笔者之前部署了一个后台管理项目&#xff0c;通过它来发布课程内容&#xff0c;其中有一个 JSP 课程页面&#xff0c;在该 JSP 页面里也引用了类文件 Constant.java 里的一个变量&#xff08;ALIYUN_OSS_PATH&#xff09;&#xff0c;…

使用ffmpeg实现音频静音修剪

1 silenceremove介绍 本文主要介绍在 FFmpeg 命令中使用 silenceremove filter 进行音频静音的修剪。 1.1 start_x参数 参数名说明取值范围默认值start_periods设置是否应在音频开头修剪音频。0 表示不应从一开始就修剪静音。当指定一个非 0 值时&#xff0c;它会修剪音频直…

2022-ECCV-Explaining Deepfake Detection by Analysing Image Matching

一、研究背景 1.大量工作将深度伪造检测作为一个二分类任务并取得了良好的性能。 2.理解模型如何在二分类标签的监督下学习伪造相关特征仍难是个艰巨的任务。 3.视觉概念&#xff1a;具有语义的人脸区域&#xff0c;如嘴、鼻子、眼睛。 二、研究目标 1.验证假设&#xff0c;并…

虹科分享 | 用Redis为LangChain定制AI代理——OpenGPTs

文章速览&#xff1a; OpenGPTs简介Redis在OpenGPTs中的作用在本地使用OpenGPTs在云端使用OpenGPTsRedis与LangChain赋能创新 OpenAI最近推出了OpenAI GPTs——一个构建定制化AI代理的无代码“应用商店”&#xff0c;随后LangChain开发了类似的开源工具OpenGPTs。OpenGPTs是一…

OpenCV——多分辨率LBP的计算方法

目录 一、算法原理1、原理概述2、参考文献 二、代码实现三、结果展示 OpenCV——多分辨率LBP的计算方法由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、算法原理 1、原理概述 基本LBP算子虽然在早期…

Golang条件编译 | 获取系统的磁盘空间内存占用demo | gopsutil/disk库(跨平台方案)

文章目录 一、Golang条件编译1. 构建标签( Build tags)2. 文件后缀&#xff08;File suffixes&#xff09; 二、GO golang 获取磁盘空间 条件编译思路 三、【推荐】使用github.com/shirou/gopsutil/disk这个库&#xff0c;如何获取机器下不同磁盘分区的内容 一、Golang条件编译…

Vue.js设计与实现阅读-2

Vue.js设计与实现阅读-2 1、前言2、框架设计的核心要素2、1 提升用户体验2、2 控制代码体积2、3 Tree-Shaking2、4 特性开关2、5 错误处理 1、前言 上一篇我们了解到了 命令式和声明式的区别&#xff0c;前者关注过程&#xff0c;后者关注结果了解了虚拟dom存在的意义&#x…

Ubuntu22.04 netplan 网络配置

Ubuntu18.04修改IP地址的方法(error in network definition ......is missing /prefixlength)_error in network definition: expected sequence-CSDN博客 Ubuntu20.04 单网卡配置多ip_ubuntu单网卡多ip-CSDN博客 ubuntu配置多网段IP-CSDN博客 Netplan使用&#xff08;高版…

把应用转为LINUX服务失败,两个奇怪错误

应用经常崩溃&#xff0c;于是就想转为服务&#xff0c;让系统帮忙重启。这个事情当然信心满满&#xff0c;咱之前做过&#xff0c;最近也刚刚实验过。想法是好的&#xff0c;现实是残酷的&#xff0c;遇到两个问题无解&#xff1a; 访问内存失败 经过定位&#xff0c;确认是…

CMake入门教程【实战篇】Ninja环境搭建与加速项目构建

文章目录 1.什么是Ninja?2.为什么选择Ninja?3.Ninja的特点4.如何使用Ninja5.vscode+msvc+cmake+ninja示例命令行操作示例vscode1.什么是Ninja? Ninja是一个专注于速度的小型构建系统。与其他构建系统不同,Ninja采用了一种低级方法,旨在实现快速的增量构建。它的设计理念是…

笔记软件内怎么查看文章字数 笔记查看字数的操作步骤

在记录生活点滴、工作要务时&#xff0c;你是否曾像我一样&#xff0c;为了知道写了多少字而犯愁&#xff1f;尤其是在需要精确控制字数时&#xff0c;那种焦虑感更是如影随形。 记得有一次&#xff0c;我为了一个项目报告苦思冥想&#xff0c;好不容易写了个初稿&#xff0c;…

Java--ListUtil工具类,实现将一个大列表,拆分成指定长度的子列表

文章目录 前言实现代码执行结果 前言 在项目中有时会出现列表很大&#xff0c;无法一次性批量操作&#xff0c;我们需要将列表分成指定大小的几个子列表&#xff0c;一份一份进行操作&#xff0c;本文提供这样的工具类实现这个需求。 实现代码 以下为代码实现&#xff1a; …

源码编译FFmpeg4.3

FreeSWITCH的mod_av模块目前&#xff08;1.10.11&#xff09;暂不支持FFmpeg4.4&#xff08;或者更高版本&#xff09;&#xff0c;但4.3就没问题 最近试了试源码编译FFmpeg4.3&#xff0c;记录如下&#xff08;系统centos7.9&#xff09;&#xff1a; git clone GitHub - Bt…

Rust语言的Hello, World! 程序解析

Rust是一门现代系统编程语言&#xff0c;注重内存安全和并发性。让我们从一个经典的 “Hello, World!” 程序开始&#xff0c;逐步解析它的每个部分。 fn main() {println!("Hello, world!"); }1. fn main() { ... } 在Rust中&#xff0c;程序的执行从 main 函数开…

锂电池的电压和容量怎么计算?

锂电池组是由电池单体&#xff08;电芯&#xff09;通过串并联来组成 1、串联(S)增加电压&#xff0c;容量不变。 例如&#xff1a;1个磷酸铁锂电池的额定电压为3.2V&#xff0c;容量为4000mAH&#xff0c;将10个磷酸铁锂电芯串联&#xff0c;电池组电压&#xff1a;3.2v*10&a…

目标检测正负样本分配策略----ATSS

一、ATSS 参考&#xff1a;https://blog.csdn.net/xuzz_498100208/article/details/110355048 https://zhuanlan.zhihu.com/p/411659547 作者提出了一种自适应的选取正样本的方法&#xff0c;具体方法如下&#xff1a; 1.对于每个输出的检测层&#xff0c;选计算每个anchor的中…

Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池

在 Spring 中&#xff0c;Async 注解用于将方法标记为异步执行的方法。当使用 Async 注解时&#xff0c;该方法将在单独的线程中执行&#xff0c;而不会阻塞当前线程。这使得方法可以在后台执行&#xff0c;而不会影响主线程的执行。 在您提供的代码示例中&#xff0c;a1() 和…

java-面向对象

什么是类&#xff1f;什么是对象&#xff1f; - 现实生活中是由很多很多对象组成的&#xff0c;基于对象抽出了类 - 对象&#xff1a;软件中真实存在的单个个体/东西 类&#xff1a;类别/类型&#xff0c;代表一类个体 - 类是对象的模子&#xff0c;对象是类的具体的实例 - 类中…

【gpt4 8k 免费使用】Coze 是一款用来开发新一代 AI Chat Bot 的应用编辑平台

Coze 快速开始 | Coze Welcome to Coze Coze 是什么&#xff1f; Coze 是一款用来开发新一代 AI Chat Bot 的应用编辑平台&#xff0c;无论你是否有编程基础&#xff0c;都可以通过这个平台来快速创建各种类型的 Chat Bot&#xff0c;并将其发布到各类社交平台和通讯软件上。…