JDK1.8 新特性详解及具体使用方法

简介: 本文详细介绍了JDK 1.8的新特性及其组件封装方法,涵盖Lambda表达式、Stream API、接口默认与静态方法、Optional类、日期时间API、方法引用、Nashorn JavaScript引擎及类型注解等内容。通过具体代码示例,展示了如何利用这些特性简化代码、提高开发效率。例如,Lambda表达式可替代匿名内部类,Stream API支持集合的函数式操作,Optional类避免空指针异常,新日期时间API提供更强大的时间处理能力。合理运用这些特性,能够显著提升Java代码的简洁性、可读性和可维护性。

Lambda表达式使用方法

  1. 基本语法
    Lambda表达式的基本形式为(参数) -> 表达式(参数) -> { 语句; }
// 无参数,返回值为String
() -> "Hello Lambda"
// 一个参数,不返回值
x -> System.out.println(x)
// 两个参数,返回值为int
(a, b) -> a + b
  1. 使用场景
    常用于简化函数式接口的实现,如Runnable、Comparator等
// 使用前
new Thread(new Runnable() {
   
    @Override
    public void run() {
   
        System.out.println("传统写法");
    }
}).start();
// 使用后
new Thread(() -> System.out.println("Lambda写法")).start();
  1. 变量捕获
    Lambda表达式可以捕获外部的final或effectively final变量
final int num = 1;
Consumer<Integer> consumer = (value) -> System.out.println(value + num);
consumer.accept(2); // 输出3

Stream API使用方法

  1. 创建Stream
    通过集合、数组等创建Stream
// 集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
// 数组创建
String[] array = {
   "a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
// 直接创建
Stream<String> stream = Stream.of("a", "b", "c");
  1. 中间操作
    对Stream进行转换、过滤等操作
// 过滤
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.filter(x -> x % 2 == 0).forEach(System.out::println); // 输出2,4
// 映射
Stream<String> stream = Stream.of("a", "b", "c");
stream.map(String::toUpperCase).forEach(System.out::println); // 输出A,B,C
  1. 终端操作
    触发Stream的执行并产生结果
// 收集
List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());
// 计数
long count = Stream.of(1, 2, 3).count();
// 归约
int sum = Stream.of(1, 2, 3).reduce(0, (a, b) -> a + b);

接口默认方法与静态方法封装

  1. 默认方法封装
    在接口中定义默认方法,提供通用实现
public interface MyInterface {
   
    default void defaultMethod() {
   
        System.out.println("默认方法实现");
    }
}
  1. 静态方法封装
    在接口中定义静态方法,提供工具类功能
public interface MyInterface {
   
    static void staticMethod() {
   
        System.out.println("静态方法实现");
    }
}
  1. 使用示例
public class MyClass implements MyInterface {
   
    // 无需实现默认方法
}
// 调用默认方法
MyClass obj = new MyClass();
obj.defaultMethod();
// 调用静态方法
MyInterface.staticMethod();

Optional类封装方法

  1. 创建Optional
// 创建非空值的Optional
Optional<String> optional = Optional.of("value");
// 创建可能为空的Optional
Optional<String> optional = Optional.ofNullable(null);
// 创建空的Optional
Optional<String> optional = Optional.empty();
  1. 安全获取值
// 获取值,不存在则返回默认值
String value = optional.orElse("default");
// 获取值,不存在则抛出异常
String value = optional.orElseThrow(() -> new IllegalArgumentException());
  1. 链式处理
optional.ifPresent(System.out::println);
optional.map(String::length).ifPresent(System.out::println);

日期时间API封装方法

  1. 日期时间工具类封装
public class DateUtils {
   
    // 获取当前日期
    public static LocalDate getCurrentDate() {
   
        return LocalDate.now();
    }
    // 日期格式化
    public static String formatDate(LocalDate date, String pattern) {
   
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return date.format(formatter);
    }
    // 计算日期差
    public static long daysBetween(LocalDate start, LocalDate end) {
   
        return ChronoUnit.DAYS.between(start, end);
    }
}
  1. 使用示例
// 获取当前日期
LocalDate now = DateUtils.getCurrentDate();
// 格式化日期
String formattedDate = DateUtils.formatDate(now, "yyyy-MM-dd");
// 计算日期差
LocalDate start = LocalDate.of(2023, 1, 1);
LocalDate end = LocalDate.of(2023, 12, 31);
long days = DateUtils.daysBetween(start, end);

方法引用封装方法

  1. 静态方法引用
public class MathUtils {
   
    public static int square(int num) {
   
        return num * num;
    }
}
// 使用方法引用
Function<Integer, Integer> square = MathUtils::square;
int result = square.apply(5); // 结果为25
  1. 实例方法引用
public class StringUtils {
   
    public boolean isEmpty(String str) {
   
        return str == null || str.isEmpty();
    }
}
// 使用方法引用
StringUtils utils = new StringUtils();
Predicate<String> isEmpty = utils::isEmpty;
boolean result = isEmpty.test(""); // 结果为true

Nashorn JavaScript引擎封装

  1. JavaScript执行工具类
public class JsExecutor {
   
    private ScriptEngine engine;
    public JsExecutor() {
   
        ScriptEngineManager manager = new ScriptEngineManager();
        engine = manager.getEngineByName("nashorn");
    }
    // 执行JavaScript代码
    public Object execute(String script) throws ScriptException {
   
        return engine.eval(script);
    }
    // 调用JavaScript函数
    public Object invokeFunction(String functionName, Object... args) 
        throws ScriptException, NoSuchMethodException {
   
        return ((Invocable) engine).invokeFunction(functionName, args);
    }
}
  1. 使用示例
JsExecutor executor = new JsExecutor();
// 执行脚本
executor.execute("function add(a, b) { return a + b; }");
// 调用函数
Object result = executor.invokeFunction("add", 3, 5);

类型注解封装

  1. 自定义类型注解
@Target({
   ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotNull {
   
    String message() default "不能为空";
}
  1. 在泛型中使用
public class Container<@NotNull T> {
   
    private T value;
    public Container(T value) {
   
        this.value = value;
    }
    public T getValue() {
   
        return value;
    }
}

以上是JDK 1.8新特性的使用方法及组件封装示例。通过合理使用这些特性,可以显著提高Java代码的简洁性、可读性和可维护性。


JDK1.8, 新特性,lambda 表达式,Stream API, 方法引用,默认方法,Optional 类,CompletableFuture, 新日期时间 API, Nashorn 引擎,PermGen 移除,并行数组排序,JavaScript 引擎,接口默认方法,Java 8 特性



准备了一些面试资料,需要的拿走
https://pan.quark.cn/s/4459235fee85


目录
相关文章
|
27天前
|
Go
Go语言同步原语与数据竞争:Mutex 与 RWMutex
在Go语言并发编程中,数据竞争是多个goroutine同时读写共享变量且未加控制导致的问题,可能引发程序崩溃或非确定性错误。为解决此问题,Go提供了`sync.Mutex`和`sync.RWMutex`两种同步机制。`Mutex`用于保护临界区,确保同一时间只有一个goroutine访问;`RWMutex`支持多读单写的细粒度控制,适合读多写少场景。使用时需避免死锁,并借助`-race`工具检测潜在的数据竞争,从而提升程序稳定性和性能。
|
6天前
|
Web App开发 监控 前端开发
2025前端性能优化三连击
2025前端性能优化三连击
198 94
|
20天前
|
前端开发 JavaScript 安全
解锁React Server Components:彻底改变前端渲染方式
解锁React Server Components:彻底改变前端渲染方式
|
25天前
|
机器学习/深度学习 人工智能 知识图谱
从“看图说话”到“脑补世界”:多模态大模型的进化之路
从“看图说话”到“脑补世界”:多模态大模型的进化之路
136 63
|
6天前
|
前端开发 C++ 容器
2025高效开发:3个被低估的CSS黑科技
2025高效开发:3个被低估的CSS黑科技
126 95
|
6天前
|
Web App开发 前端开发 JavaScript
CSS :has() 选择器:改变游戏规则的父选择器
CSS :has() 选择器:改变游戏规则的父选择器
181 95
|
6天前
|
缓存 监控 前端开发
告别卡顿!3大前端性能优化魔法 + CSS容器查询实战
告别卡顿!3大前端性能优化魔法 + CSS容器查询实战
156 95
|
19天前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
150 61