lambda+sealed+record

引言

随着语言发展,java中的语法也再丰富和变迁,这里列举一些比较常用的又容易忽略的地方,有些特性需要适当使用,不要使用过当或者过早使用,使代码难以维护。

1 interface

Java 接口(Interface)中可以包含以下几种内容:

‌1常量(Constants)‌

接口中的成员变量默认是 public static final 的,因此它们实际上是常量。

例如:int CONSTANT = 10; 等价于 public static final int CONSTANT = 10;

2 抽象方法(Abstract Methods)‌

接口中的方法默认是抽象的,没有方法体。

实现接口的类必须提供这些方法的具体实现。

从 Java 8 开始,可以省略 public abstract 修饰符。

2 默认方法(Default Methods)‌

从 Java 8 开始,接口可以包含带有方法体的默认方法。

使用 default 关键字修饰,实现类可以不实现这些方法。

3 静态方法(Static Methods)‌

从 Java 8 开始,接口可以包含静态方法。

使用 static 关键字修饰,必须通过接口名称调用。

‌4 私有方法(Private Methods)‌

从 Java 9 开始,接口可以包含私有方法。

用于辅助默认方法或静态方法实现逻辑复用。

5 ‌嵌套类型(Nested Types)‌

接口可以包含内部类、接口、枚举等嵌套类型。

2 lambda

函数式接口(Functional Interface)是Java 8引入的一个核心概念,指的是那些有且仅有一个抽象方法的接口(但可以有多个默认方法或静态方法)。这一特性与Lambda表达式紧密相关,因为Lambda表达式可以作为函数式接口的实现。函数式接口的定义通常使用@FunctionalInterface注解来明确标识,尽管这个注解不是必需的,但它可以帮助编译器检查接口是否符合函数式接口的定义。所以如果是函数式接口,最好强制加上注解。

函数式接口可以继承,继承类也最好加上注解。子类不能再加上抽象方法,不然就会多出一个抽象方法,系统没法处理。默认方法和静态方法可以被覆盖和增加

函数值接口产生的背景主要是适应函数式变成风格,简化代码编写

复制代码
//加大括号
		TestFun3<String> tf3 = () -> {return "xx";};
		//或者自动使用最后一句话作为返回值
//		TestFun3<String> tf3 = () ->  "xx";

常用函数式接口

3 sealed

密封类使得类的控制更细粒度,‌Java15‌首次作为预览特性引入,Java 16‌继续作为预览特性进行改进,Java 17‌正式成为标准特性,Java25‌对密封机制进行了升级,将其扩展为"可扩展密封体系"

复制代码
//java25 定义一个密封类
public sealed abstract class Shape permits Circle, Rectangle, Triangle {
 public abstract double area();
}

使用关键字定义sealed abstract,必须使用permits限制可继承子类

4 record

Java的record 关键字是在Java14中作为预览特性引入,并在 Java 16 中正式成为标准特性。它主要用于简化不可变数据类的定义,减少样板代码的编写。

基本语法

public record RecordName(参数列表) { }

主要特点:

‌1 自动实现方法‌:编译器会自动生成构造方法、getter 方法、equals()、hashCode() 和 toString() 方法。

2‌ 不可变性‌:所有字段默认为 final,创建后无法修改。

‌3 简洁语法‌:只需声明字段,其他代码由编译器自动生成。

‌4 继承关系‌:record 类隐式继承 java.lang.Record 类,不能显式继承其他类。

与普通类的区别

1 record 类是不可变的,所有字段都是 final

2 不支持手动添加非 final 字段

3 可以声明静态字段、静态方法和实例方法

4 不能继承其他类,但可以实现接口

复制代码
// 定义一个简单的 record
public record Person(String name, int age) { }

// 使用 record
Person person = new Person("Alice", 30);
System.out.println(person.name()); // 访问 name 字段
System.out.println(person.age());  // 访问 age 字段
System.out.println(person);        // 自动调用 toString()

Java record 类的大括号内可以声明以下成员:

1 ‌静态字段‌:可以声明静态的常量字段

‌2 静态方法‌:可以定义静态方法

‌3 实例方法‌:可以定义实例方法

‌4 构造方法‌:可以定义构造方法(包括显式构造方法和紧凑构造方法)

‌5 嵌套类型‌:可以声明内部类、接口、枚举等嵌套类型

复制代码
//定义一个简单的 record
public record Person(String name, int age) {
	 // 静态字段
    private static final String DEFAULT_NAME = "Unknown";
    
    // 静态方法
    public static Person of(String name, int age) {
        return new Person(name, age);
    }
    
    // 实例方法
    public String displayName() {
        return "Name: " + name;
    }
    
    // 构造方法(紧凑构造方法)
    public Person {
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
    }
    
    // 嵌套类型
    public static class Info {
        // 内部类定义
    }
}
相关推荐
盟接之桥2 小时前
盟接之桥EDI软件:API数据采集模块深度解析,打造企业数据协同新引擎
java·运维·服务器·网络·数据库·人工智能·制造
yzx9910132 小时前
Python数据结构入门指南:从基础到实践
开发语言·数据结构·python
HoneyMoose2 小时前
Spring Boot 2.4 部署你的第一个 Spring Boot 应用需要的环境
java
皮皮林5512 小时前
为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??
java
衍生星球3 小时前
【JSP程序设计】Servlet对象 — page对象
java·开发语言·servlet·jsp·jsp程序设计
vx-Biye_Design3 小时前
servlet家政公司管理系统-计算机毕业设计源码01438
java·vue.js·spring·servlet·tomcat·maven·mybatis
云和数据.ChenGuang3 小时前
jenkins安装需要多少版本的jdk
java·servlet·jenkins
linux运维客栈3 小时前
Jenkins 最稳部署指南(含版本选择、Compose 部署、插件推荐)
java·servlet·jenkins
扶苏瑾3 小时前
线程安全问题的产生原因与解决方案
java·开发语言·jvm