JAVA SE8

news2024/9/21 13:34:49

文章目录

    • 一,介绍
    • Lambda
      • Lambda 表达式简介
      • Lambda 表达式的应用场景
      • 示例代码
        • Lambda表达式作为方法参数
        • Lambda表达式与集合操作
        • 方法引用示例
    • Stream API
      • Stream API 介绍
        • 创建 Stream
        • 过滤数据
        • 映射数据
        • 排序数据
        • 聚合数据
        • 匹配数据
        • 其他功能
    • java.time包
      • 新的日期和时间API(java.time包)
        • LocalDate
        • LocalTime
        • LocalDateTime
        • DateTimeFormatter
      • 其他相关类
    • 默认方法和静态方法
      • 默认方法和静态方法
        • 默认方法
          • 示例代码:
        • 静态方法
          • 示例代码:
      • 总结
    • 方法引用
        • 静态方法引用
          • 示例代码:
        • 实例方法引用
          • 示例代码:
        • 类的任意对象方法引用
          • 示例代码:
        • 构造方法引用
          • 示例代码:
        • 注意事项

一,介绍

JDK 1.8,即Java 8,是Oracle公司发布的Java平台的重要版本,其正式发布日期是2014年3月18日。这个版本包含了大量革新性的特性和改进,这些特性不仅增强了Java语言本身的表达力,同时也改善了开发者的编程体验。下面是关于JDK 1.8的一些主要特性的详细介绍:

  1. Lambda表达式

    • Lambda表达式是一种轻量级的匿名函数,它们可以作为方法参数或者返回值,极大地简化了函数式编程模式在Java中的应用。Lambda表达式使得代码更加简洁和易于维护。
  2. Stream API

    • Stream API是一个新的框架,它提供了高级抽象来进行集合类的操作,比如搜索、过滤、映射和排序等。Stream API的设计允许开发者利用现代多核硬件进行并行处理,而不需要关心线程管理和同步的问题。
  3. 新的日期和时间API

    • Java 8引入了新的日期时间API (java.time 包),其中包括LocalDate, LocalTime, LocalDateTime, ZonedDateTime等类。这些类设计得更为直观和易用,并且它们是不可变的,这意味着它们非常适合在并发环境中使用。
  4. 默认方法和静态方法

    • 在接口中可以声明默认方法和静态方法,这为接口的实现者提供了默认的行为定义,同时保持了向后兼容性。静态方法则可以在不创建接口实例的情况下直接调用。
  5. 方法引用

    • 方法引用是Lambda表达式的补充,它提供了一种简洁的方式去引用现有的类方法或构造器,或者是特定对象的实例方法。
  6. 更好的类型推断

    • JDK 1.8中的类型推断机制得到了改善,这使得在创建泛型实例时可以省略类型参数,从而让代码更为清晰。
  7. 并行流

    • 并行流(Parallel Stream)允许自动利用多核心的计算能力,对数据进行高效并行处理。这有助于提高应用程序在多核处理器上的执行效率。

此外,JDK 1.8还包含了一些其他的改进,比如:

  • 改进了类型注解,使得类型系统更为强大。
  • 引入了Nashorn JavaScript引擎,它能够在Java平台上运行JavaScript脚本。
  • 允许使用重复注解,这样就可以在同一位置多次应用相同的注解。

Lambda

Lambda 表达式简介

  • 语法:Lambda表达式的语法包括参数列表和Lambda体两部分。参数列表可以省略类型声明,Lambda体可以简化为单个表达式而无需大括号和return关键字(如果体内的确只有一条语句)。

  • 函数式接口:Lambda表达式必须与函数式接口一起使用,后者是指仅有一个抽象方法的接口。Lambda表达式可以赋值给此类接口类型的变量或传递给期望该接口的方法。

  • 方法引用:这是一种更简洁的方式,用于引用已有类或对象的方法或构造器。方法引用的语法为“对象或类名::方法名”,适用于某些Lambda表达式场景。

Lambda 表达式的应用场景

  • 集合操作:Java 8的Stream API允许使用Lambda表达式来进行集合的过滤、映射、排序和聚合等操作。这极大地方便了集合数据的处理。

  • 接口中的默认方法和静态方法:Java 8允许在接口中定义默认方法(使用default关键字)和静态方法。这为接口提供了一种向后兼容的方式去扩展新功能,以及提供工具方法。

示例代码

Lambda表达式作为方法参数
@FunctionalInterface
interface MyFunction<T> {
    T apply(T t);
}

public static void processString(String str, MyFunction<String> function) {
    String result = function.apply(str);
    System.out.println(result);
}

public static void main(String[] args) {
    String input = "Hello, World!";
    processString(input, String::toUpperCase); // 使用方法引用
}
Lambda表达式与集合操作
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

// 过滤
List<String> filteredNames = names.stream()
                                   .filter(name -> name.length() > 4)
                                   .collect(Collectors.toList());

// 映射
List<Integer> nameLengths = names.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());

// 排序
List<String> sortedNames = names.stream()
                                .sorted()
                                .collect(Collectors.toList());

// 聚合
int sumOfNameLengths = names.stream()
                            .mapToInt(String::length)
                            .sum();
方法引用示例
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 使用Lambda表达式
numbers.forEach(n -> System.out.println(n));

// 使用方法引用
numbers.forEach(System.out::println);

Stream API

Stream API 介绍

Java 8引入的Stream API是一个强大的工具集,用于处理集合和其他数据源,如文件或I/O通道。它提供了一种声明式的方式来进行数据处理,支持懒惰求值、并行执行等特性。下面是对Stream API的重点介绍以及一些基本操作的代码示例:

创建 Stream
  • 从集合创建

    List<String> list = Arrays.asList("apple", "banana", "orange");
    Stream<String> stream = list.stream(); // 或者 list.parallelStream() 以启用并行执行
    
  • 通过静态方法创建

    Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
    
过滤数据
  • filter() 方法可以根据提供的谓词筛选出符合条件的元素:
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> evenNumbers = numbers.stream()
                                       .filter(n -> n % 2 == 0)
                                       .collect(Collectors.toList());
    
映射数据
  • map() 方法用于转换集合中的元素:
    List<String> words = Arrays.asList("Hello", "World");
    List<Integer> wordLengths = words.stream()
                                     .map(s -> s.length())
                                     .collect(Collectors.toList());
    
排序数据
  • sorted() 方法可以对集合中的元素进行排序:
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> sortedNames = names.stream()
                                    .sorted()
                                    .collect(Collectors.toList());
    
聚合数据
  • reduce() 方法可以将集合中的所有元素归约为单一结果:
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = numbers.stream()
                     .reduce(0, Integer::sum); // 或者使用 (a, b) -> a + b;
    
匹配数据
  • anyMatch() 方法检查是否有任何元素符合给定的条件:
    List<String> words = Arrays.asList("apple", "banana", "orange");
    boolean containsA = words.stream()
                             .anyMatch(s -> s.contains("a"));
    
其他功能
  • 去重:使用distinct()去除重复元素。
  • 分组:使用groupingBy()按照某个属性对元素进行分组。
  • 归约:除了reduce()外,还可以使用collectingAndThen()等方法进行复杂的归约操作。

这些操作可以组合在一起形成流水线,从而以一种声明式的方式处理数据。例如:

List<String> words = Arrays.asList("apple", "banana", "orange");
List<Integer> lengths = words.stream()
                             .filter(w -> w.contains("a"))
                             .map(String::length)
                             .collect(Collectors.toList());

以上就是关于Java 8 Stream API的基本介绍和一些常见操作的示例。Stream API不仅让集合操作变得简单,还提供了更好的可读性和更高的性能。

java.time包

新的日期和时间API(java.time包)

Java 8引入了新的日期和时间API,该API位于java.time包下,提供了一系列类来更好地处理日期和时间。下面是该API的一些关键特性及代码示例:

LocalDate
  • 用于表示日期,不包含时间和时区信息。

  • 创建当前日期

    LocalDate currentDate = LocalDate.now();
    System.out.println(currentDate); // 输出:2024-09-20(假设当前日期为2024年9月20日)
    
  • 创建指定日期

    LocalDate specificDate = LocalDate.of(2024, Month.SEPTEMBER, 20);
    System.out.println(specificDate); // 输出:2024-09-20
    
LocalTime
  • 用于表示时间,不包含日期和时区信息。

  • 创建当前时间

    LocalTime currentTime = LocalTime.now();
    System.out.println(currentTime); // 输出:19:05 (假设当前时间为19时05分)
    
  • 创建指定时间

    LocalTime specificTime = LocalTime.of(19, 5);
    System.out.println(specificTime); // 输出:19:05
    
LocalDateTime
  • 用于表示日期和时间,不包含时区信息。

  • 创建当前日期和时间

    LocalDateTime currentDateTime = LocalDateTime.now();
    System.out.println(currentDateTime); // 输出:2024-09-20T19:05
    
  • 创建指定日期和时间

    LocalDateTime specificDateTime = LocalDateTime.of(2024, Month.SEPTEMBER, 20, 19, 5);
    System.out.println(specificDateTime); // 输出:2024-09-20T19:05
    
DateTimeFormatter
  • 用于格式化和解析日期时间对象

  • 格式化日期时间为字符串

    LocalDateTime currentDateTime = LocalDateTime.now();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String formattedDateTime = currentDateTime.format(formatter);
    System.out.println(formattedDateTime); // 输出:2024-09-20 19:05
    
  • 解析字符串为日期时间

    String dateTimeString = "2024-09-20 19:05";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter);
    System.out.println(parsedDateTime); // 输出:2024-09-20T19:05
    

其他相关类

此外,java.time包还提供了其他几个有用的类,如:

  • ZonedDateTime:代表带有时区的日期时间。
  • OffsetDateTime:代表带有偏移量的日期时间。
  • DurationPeriod:分别用于表示两个时间点之间的持续时间和日期间隔。
  • Instant:代表时间戳,通常用于与时钟系统交互。

默认方法和静态方法

默认方法和静态方法

Java 8引入了两种新的方法类型,允许在接口中定义更多的行为而不破坏现有的实现。以下是关于这两种方法类型的详细介绍和示例代码。

默认方法

默认方法(default method)是在接口中定义的一种特殊类型的方法,它提供了一个默认的实现。这种机制允许在不改变现有实现类的前提下,向接口中添加新方法。默认方法使用default关键字声明。

示例代码:
public interface MyInterface {
    // 默认方法
    default void myDefaultMethod() {
        System.out.println("这是默认方法");
    }
}

public class MyClass implements MyInterface {
    // 不需要重新实现这个方法,除非你想覆盖默认的行为
}

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj.myDefaultMethod(); // 输出:这是默认方法
    }
}

在这个例子中,MyInterface接口包含了一个默认方法myDefaultMethod()。由于MyClass实现了MyInterface,并且没有提供自己的实现,所以它将使用接口中定义的默认实现。

静态方法

静态方法(static method)是在接口中定义的公共静态方法,它们不是接口实现的一部分,而是属于接口本身的工具方法。这些方法可以直接通过接口名来调用,不需要实例化接口的实现类。

示例代码:
public interface MyInterface {
    // 静态方法
    static void myStaticMethod() {
        System.out.println("这是静态方法");
    }
}

public class Main {
    public static void main(String[] args) {
        MyInterface.myStaticMethod(); // 输出:这是静态方法
    }
}

在这个例子中,MyInterface接口包含了一个静态方法myStaticMethod()。由于它是静态的,可以通过接口名直接调用来执行。

总结

  • 默认方法:允许在不修改现有实现类的情况下向接口添加新的方法。这对于向旧的接口添加新的功能尤其有用,因为它可以为新方法提供一个默认实现,现有类可以选择是否覆盖这个默认行为。
  • 静态方法:提供了一种在接口级别上定义工具方法的方式。这些方法独立于任何特定的接口实现,并且可以直接通过接口名来访问。

方法引用

方法引用是Java 8引入的一项特性,它允许我们引用已有的方法或构造器作为Lambda表达式的替代,从而使得代码更加简洁和易读。以下是关于方法引用的不同类型的详细说明及示例代码。

静态方法引用

静态方法引用允许你引用一个类中的静态方法。格式如下:

类名::静态方法名
示例代码:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
       .map(Integer::valueOf) // 引用静态方法:Integer.valueOf
       .forEach(System.out::println); // 引用实例方法:System.out.println
实例方法引用

实例方法引用允许你引用一个特定对象的实例方法。格式如下:

实例对象::实例方法名
示例代码:
String str = "hello";
Function<String, Integer> func = str::length; // 引用实例方法:String.length
int length = func.apply(str);
类的任意对象方法引用

这类方法引用允许你引用一个类的任意实例的方法,而不是特定的实例。格式如下:

类名::实例方法名
示例代码:
List<String> strings = Arrays.asList("apple", "banana", "orange");
strings.stream()
       .map(String::toUpperCase) // 引用实例方法:String.toUpperCase
       .forEach(System.out::println); // 引用实例方法:System.out.println
构造方法引用

构造方法引用允许你引用一个类的构造方法来创建新的对象。格式如下:

类名::new
示例代码:
Supplier<List<String>> supplier = ArrayList::new; // 引用构造方法:ArrayList()
List<String> list = supplier.get();
注意事项

尽管方法引用非常有用,但在使用时也需要注意以下几点:

  1. 适用性:只有当Lambda表达式的功能与某个已存在的方法完全一致时,才可以使用方法引用。
  2. 目标类型:方法引用的目标类型应该是一个函数式接口,即一个只有一个抽象方法的接口。
  3. 参数匹配:引用的方法的参数列表必须与Lambda表达式的参数列表相匹配。
  4. 返回类型:引用的方法返回类型必须与Lambda表达式的返回类型相匹配。

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

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

相关文章

C语言——————结构体

前言&#xff1a; 我们都已经学了很多int char …等类型还学到了同类型元素构成的数组&#xff0c;以及取上述类型的指针&#xff0c;在一些小应用可以灵活使用&#xff0c;然而&#xff0c;在实际问题中有时候我们需要几种数据类型一起来修饰某个变量。 例如一个学生的信息就…

2024 “华为杯” 中国研究生数学建模竞赛(F题)深度剖析|X射线脉冲星光子到达时间建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; CS团队倾注了大量时间和心血&#xff0c;深入挖掘解…

如何成为信息安全等级测评师?具体有哪些要求?

给大家的福利&#xff0c;点击下方蓝色字 即可免费领取↓↓↓ &#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 文章目录 前言 信息安全等级测评师 定义与作用&#xff1a;证书颁发&#xff1a;能力要求&#x…

2024 “华为杯” 中国研究生数学建模竞赛(C题)深度剖析|数据驱动下磁性元件的磁芯损耗建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; CS团队倾注了大量时间和心血&#xff0c;深入挖掘解…

植保无人机是朝阳产业还是夕阳产业?

植保无人机产业是朝阳产业还是夕阳产业&#xff0c;可以从多个维度进行分析&#xff1a; 一、市场需求与增长趋势 市场需求&#xff1a;随着农业现代化的推进和劳动力成本的上升&#xff0c;植保无人机因其高效、安全、节省农药等优势&#xff0c;在农业生产中的应用越来越广…

Spring Boot赋能高校心理健康教育

1绪 论 1.1研究背景 随着计算机和网络技术的不断发展&#xff0c;计算机网络已经逐渐深入人们的生活&#xff0c;网络已经能够覆盖我们生活的每一个角落&#xff0c;给用户的网上交流和学习提供了巨大的方便。 当今社会处在一个高速发展的信息时代&#xff0c;计算机网络的发展…

【Python】探索 Errbot:多功能聊天机器人框架

不是旅行治愈了你&#xff0c;是你在路上放过了自己。 在当今的数字化时代&#xff0c;聊天机器人已成为企业与客户互动、提升工作效率和增加乐趣的重要工具。Errbot是一个高度可扩展的聊天机器人框架&#xff0c;它允许开发者使用Python轻松创建和定制机器人。本文将介绍Errb…

【linux008】目录操作命令篇 - rmdir 命令

文章目录 1、基本用法2、常见选项3、举例4、注意事项 rmdir 是 Linux 系统中的一个命令&#xff0c;用于删除空目录。它只能删除 空目录&#xff0c;如果目录中存在文件或子目录&#xff0c;则无法删除。 1、基本用法 rmdir [选项] 目录名...2、常见选项 -p, --parents&…

1.4 MySql配置文件

既然我们开始学习数据库&#xff0c;就不能像大学里边讲数据库课程那样简单讲一下&#xff0c;增删改查&#xff0c;然后介绍一下怎么去创建索引&#xff0c;怎么提交和回滚事务。我们学习数据库要明白怎么用&#xff0c;怎么配置&#xff0c;学懂学透彻了。当然MySql的配置参数…

关于群里脱敏系统的讨论2024-09-20

群里大家讨论脱敏系统&#xff0c;傅同学&#xff1a;秦老师&#xff0c;银行数据脱敏怎么做的&#xff0c;怎么存储的&#xff1f; 采购了脱敏系统&#xff0c;一般是硬件&#xff08;厂商直接卖的一体机&#xff09;。这个系统很复杂&#xff0c;大概卖50-100万一台。 最核…

为什么消费还能返利?2024年全新返利模型!

在当今竞争激烈的电商市场中&#xff0c;一种名为“循环购”的创新商业模式正悄然兴起&#xff0c;以其独特的消费返利机制和积分体系&#xff0c;为消费者带来了前所未有的购物体验 一、循环购模式&#xff1a;消费即投资的智慧选择 循环购模式并非简单的消费行为&#xff0c…

MySQL | 知识 | 从底层看清 InnoDB 数据结构

文章目录 一、InnoDB 简介InnoDB 行格式COMPACT 行格式CHAR(M) 列的存储格式VARCHAR(M) 最多能存储的数据记录中的数据太多产生的溢出行溢出的临界点 二、表空间文件的结构三、InnoDB 数据页结构页页的概览Infimum 和 Supremum使用Page Directory页的真实面貌 四、B 树是如何进…

重生奇迹MU 强化玩法套路多 极品装备由你打造

欢迎来到重生奇迹MU的强化玩法指南&#xff01;想要打造极品装备吗&#xff1f;不可错过这篇文章&#xff0c;我们将为您揭开最多套路的强化技巧和窍门&#xff0c;帮您节省时间和资源&#xff0c;并带来最高效的升级结果。无论您是新手还是老玩家&#xff0c;本文适合所有级别…

基于MySQL全量备份+GTID同步的主从架构恢复数据至指定时间点

系列文章目录 基于GTID同步搭建主从复制 MySQL全量备份 文章目录 系列文章目录前言一、环境准备二、构建测试数据1.安装sysbench2.构建测试数据3.准备全量备份4.将全量备份和binlog拷贝到临时数据库服务器5.模拟误删除表操作 三、恢复数据到指定时间点1.临时数据库恢复数据2.找…

【Delphi】中的数据绑定(LiveBindings)

LiveBindings 是 RAD Studio 中 VCL 和 FireMonkey 框架都支持的数据绑定功能。 LiveBindings 是一个基于表达式的框架&#xff0c;这意味着它使用绑定表达式将对象绑定到其他对象或数据集字段。 LiveBindings 概述 LiveBindings 基于关系表达式&#xff0c;即绑定表达式&am…

react 甘特图之旅

react-gantt GitHub 仓库: https://github.com/clayrisser/react-gantt react-gantt-chart GitHub 仓库: https://github.com/MaTeMaTuK/gantt-task-react easy-gant-beta GitHub 仓库: https://github.com/web-widgets/react-gantt-demos 上面的版本不兼容 dhtmlx-gant…

一周热门|比GPT-4强100倍,OpenAI有望年底发布GPT-Next;1个GPU,1分钟,16K图像

大模型周报将从【企业动态】【技术前瞻】【政策法规】【专家观点】四部分&#xff0c;带你快速跟进大模型行业热门动态。 01 企业动态 Ilya 新公司 SSI 官宣融资 10 亿美元 据路透社报道&#xff0c;由 OpenAI 联合创始人、前首席科学家 Ilya Sutskever 在 2 个多月前共同创…

抖音如何改ip地址到另外城市

在数字化时代&#xff0c;抖音作为广受欢迎的社交媒体平台&#xff0c;不仅连接了亿万用户&#xff0c;也成为了展示个人生活、分享创意内容的重要舞台。然而&#xff0c;有时候出于隐私保护等需求&#xff0c;用户可能希望更改抖音账号显示的IP地址&#xff0c;使其看起来像是…

奇安信渗透2面经验分享

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

泛微E9开发 创建自定义浏览框,关联物品管理表【1】

创建自定义浏览框&#xff0c;关联物品管理表【1】 1、自定义浏览框1.1 概念1.2 前端样式 2、创建物品管理表2.1 新建建模表单操作方法2.2 物品管理表 3、创建浏览按钮 1、自定义浏览框 1.1 概念 自定义浏览框可以理解为是建模引擎中的表与表关联的一个桥梁。比如利用建模引擎…