Java 8:不可不知的新特性与实用技巧

函数式接口与Lambda

定义:函数式接口是只有一个抽象方法的接口。通过 @FunctionalInterface 注解可以限制接口只能有一个抽象方法。

Lambda 表达式让 Java 支持了函数式编程风格,使得代码更加简洁,并大大简化了对接口的实现。我们一起来看看它支持那些地方使用。

目的: 函数式接口的设计目的是为了能够将其作为 Lambda 表达式的目标类型,从而实现函数式编程的风格。

以下有几个函数式接口和Lambda表达式应用的例子。

Predicate< T >

Predicate 接口表示一个接受单个参数并返回 boolean 值的断言,用于条件判断。

  • 方法: boolean test(T t)
  • 常用场景: 过滤数据、条件判断等。
Predicate<Integer> isEven = x -> x % 2 == 0;
System.out.println(isEven.test(4));  // 输出: true
System.out.println(isEven.test(5));  // 输出: false
Consumer< T >

Consumer 接口表示一个接受单个输入参数并进行某些操作,但不返回结果的操作。

  • 方法: void accept(T t)
  • 常用场景: 用于执行某个操作,如打印、存储、操作数据。
Consumer<Integer> consumer = age -> System.out.println(age);
consumer.accept(5); //输出:5
Supplier< T >

Supplier 接口表示一个无参的提供者,返回特定类型的结果。

  • 方法: T get()
  • 常用场景: 延迟计算、创建新对象等。
Supplier<Integer> supplier = () -> new Random().nextInt();
System.out.println(supplier.get());
Function<T, R>

Function 接口表示一个接受一个输入参数并返回结果的函数。

  • 方法: R apply(T t)
  • 常用场景: 用于转换、映射操作。
Function<String, Integer> stringLength = (s) -> s.length();
System.out.println(stringLength.apply("Hello"));  // 输出: 5
总结
  • Predicate<T> 用于条件判断。
  • Consumer<T> 用于消费数据,不返回结果。
  • Supplier<T> 用于提供数据。
  • Function<T, R> 用于输入输出转换。

Stream API

定义:Stream API 用于处理集合数据,支持链式操作,能够更方便地进行过滤、排序、映射等操作。

创建 Stream
  • Stream.of(T... values): 创建一个包含给定元素的流。
  • Collection.stream():通过一个集合创建一个流。
Stream<Integer> integerStream = Stream.of(1, 2, 3);
integerStream.forEach(System.out::println);List<Integer> integerList = Arrays.asList(1, 2, 3);
integerList.stream().forEach(System.out::println);
中间操作
  • filter(Predicate<? super T> predicate): 过滤出符合条件的元素。
List<Integer> integerList = Arrays.asList(1, 2, 3);
integerList.stream().filter( x -> x % 2 == 0 ); //只剩能整除2的数
  • map(Function<? super T, ? extends R> mapper): 将每个元素映射为另一个对象。
List<String> list = Arrays.asList("A", "B", "C");
list.stream().map(String::toLowerCase).forEach(System.out::println);  // 输出: a b c
  • sorted(): 对流中的元素进行排序。
java复制代码List<String> list = Arrays.asList("B", "A", "C");
list.stream().sorted().forEach(System.out::println);  // 输出: A B C
终止操作

这些操作会产生一个结果或副作用,并关闭流。

  • forEach(Consumer<? super T> action): 对每个元素执行操作。
List<String> list = Arrays.asList("A", "B", "C");
list.stream().forEach(System.out::println);  // 输出: A B C
  • collect(Collector<? super T, A, R> collector): 将流的元素收集到集合中。
List<String> list = Arrays.asList("A", "B", "C");
List<String> result = list.stream().collect(Collectors.toList());
System.out.println(result);  // 输出: [A, B, C]
  • count(): 返回流中元素的数量。
List<String> list = Arrays.asList("A", "B", "C");
long count = list.stream().count();
System.out.println(count);  // 输出: 3

日期时间 API

LocalDate:表示没有时间的日期(年、月、日)。

LocalTime:表示没有日期的时间(小时、分钟、秒)。

LocalDateTime:表示日期和时间的组合。

ZonedDateTime:表示包含时区的日期时间。

常用方法
  • 获取当前日期和时间

    LocalDate today = LocalDate.now();
    LocalTime now = LocalTime.now();
    LocalDateTime nowDateTime = LocalDateTime.now();
    ZonedDateTime nowZoned = ZonedDateTime.now();
    
  • 格式化日期时间 使用 DateTimeFormatter 类来格式化和解析日期时间。

    示例:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate date = LocalDate.parse("2024-10-28", formatter);
    System.out.println(date);  // 输出: 2024-10-28
    
  • 日期时间的加减

    LocalDate nextWeek = LocalDate.now().plusWeeks(1);
    LocalDate previousMonth = LocalDate.now().minusMonths(1);
    
  • 比较日期和时间

    LocalDate date1 = LocalDate.of(2024, 1, 1);
    LocalDate date2 = LocalDate.of(2024, 10, 28);
    boolean isBefore = date1.isBefore(date2);  // true
    boolean isAfter = date1.isAfter(date2);    // false
    

接口默认方法

定义与语法
  • 默认方法使用default关键字来定义,其语法结构如下:

    public interface MyInterface {default void myDefaultMethod() {System.out.println("This is a default method");}
    }
    
特性
  • 可选实现:实现该接口的类可以选择重写默认方法,也可以直接使用接口提供的默认实现。
  • 多重继承:如果一个类实现了多个接口,且这些接口中都有同名的默认方法,编译器会报错,此时需要在实现类中显式重写该方法以消除歧义。
优点
  • 向后兼容性:可以在接口中添加新方法而不影响已有的实现类,确保向后兼容。
  • 减少代码重复:可以为多个实现类提供通用的功能,减少代码的重复。
  • 灵活性:实现类可以选择重写或使用默认实现,提供了灵活的设计。
使用场景
  • API 设计:当需要为接口添加新功能而不破坏已有实现时,可以使用默认方法。
  • 提供通用功能:在接口中实现一些通用功能,供实现类直接使用。

Optional 类

  • 定义Optional 类用来解决可能出现的 NullPointerException 问题,通过显式的空值检查方式,提供更安全的编程方式。

    Optional<String> name = Optional.ofNullable(null);
    name.ifPresent(System.out::println);
    
  • 作用:避免 null 值引发的异常,增强代码的健壮性和可读性。

并行 (Parallel) Stream

  • 定义parallelStream 可以并行化处理流操作,提高处理大数据集合时的性能。

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.parallelStream().forEach(System.out::println);
    
  • 作用:充分利用多核 CPU 资源,在并发环境下实现数据流的高效处理。

Metaspace

  • 定义:JDK 8 用 Metaspace 取代了永久代 (PermGen),使类元数据存储在本地内存而非堆中。
  • 作用:避免 PermGen 容量固定的缺陷,提升内存管理的灵活性。

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

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

相关文章

QT界面开发--我的第一个windows窗体【菜单栏、工具栏、状态栏、铆接部件、文本编辑器、按钮、主界面】

经过前面的铺垫&#xff0c;今天我们就开始我们图形化界面之旅了&#xff0c;我们的第一个窗体主要包括&#xff1a;菜单栏、状态栏、工具栏、铆接部件、还有Qt提供的一些主窗体的API。 第一部分&#xff1a;主界面(QMainWindow) 当创建好项目后&#xff0c;我们直接运行&…

logdata-anomaly-miner:一款安全日志解析与异常检测工具

关于logdata-anomaly-miner logdata-anomaly-miner是一款安全日志解析与异常检测工具&#xff0c;该工具旨在以有限的资源和尽可能低的权限运行分析&#xff0c;以使其适合生产服务器使用。 为了确保 logdata-anomaly-miner的正常运行&#xff0c;推荐安装了python > 3.6的…

Qt 文本文件读写与保存

Qt 文本文件读写与保存 开发工具&#xff1a;VS2013 QT5.8 设计UI界面&#xff0c;如下图所示 sample7_1QFile.h 头文件&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample7_1QFile.h"class sample7_1QFile : public QMainWin…

中国人寿财险青岛市分公司:保障民生,传递关爱

中国人寿财险青岛市分公司以保障民生为使命&#xff0c;传递关爱与温暖。 在健康险领域&#xff0c;公司为市民提供全面的医疗保障。从重大疾病保险到普通医疗保险&#xff0c;满足不同客户的需求。通过与医疗机构合作&#xff0c;为客户提供便捷的就医服务和理赔服务&#xf…

Linux下的文件IO操作

目录 1.前导 1.1文件知识 1.2对比一下文件操作和重定向 1.2.1输入重定向 1.2.2追加重定向 1.3当前路径 1.4stdin stdout stderr 2.文件操作的系统调用接口 2.1.open()打开文件 2.1.2.flags参数 2.1.3.mode参数 2.1.3 umask()函数 2.2.write()向文件写入 ​编辑 2…

【Kaggle | Pandas】练习1:创造、阅读和写作

文章目录 1. 创建DataFrame2. 创建数据表3. 创建可变Series表4. 读取csv 数据集5. 保存csv 文件 1. 创建DataFrame 在下面的单元格中&#xff0c;创建一个 DataFrame fruits &#xff0c;如下所示&#xff1a; import pandas as pd # Your code goes here. Create a datafr…

Javaee---多线程(一)

文章目录 1.线程的概念2.休眠里面的异常处理3.实现runnable接口4.匿名内部类子类创建线程5.匿名内部类接口创建线程6.基于lambda表达式进行线程创建7.关于Thread的其他的使用方法7.1线程的名字7.2设置为前台线程7.3判断线程是否存活 8.创建线程方法总结9.start方法10.终止&…

Spring《声明式事务》

知识点&#xff1a; Spring 声明式事务 1.基于注解和配置类的Spring-jdbc环境搭建 1. 准备项目&#xff0c;pom.xml <dependencies> <!--spring context依赖--> <!--当你引入Spring Context依赖之后&#xff0c;表示将Spring的基础依赖引入了--> …

七款主流图纸加密软件强力推荐|2024年CAD图纸加密保护指南

在当今信息化的设计行业&#xff0c;保护CAD图纸的知识产权和数据安全变得尤为重要。随着越来越多的企业采用数字化设计和共享文件&#xff0c;如何防止CAD图纸被未经授权的访问和窃取成为了许多设计师和企业关注的焦点。为此&#xff0c;选用合适的图纸加密软件是保护CAD文件安…

《数据结构》学习系列——树(下)

系列文章目录 目录 树和森林的遍历树的遍历森林的遍历基本算法递归先根遍历树迭代先根遍历树树和森林的层次遍历 压缩与哈夫曼树文件编码扩充二叉树哈夫曼树和哈夫曼编码哈夫曼树的基本思路哈夫曼编码 树和森林的遍历 树的遍历 先根遍历&#xff1a;先访问树的根结点&#x…

想作弊❓用这个发起考试,根本没法作弊

&#x1f389; 推荐一款超实用的在线考试神器 —— 土著刷题✨ 如果你正在寻找一个既方便又高效的在线考试平台&#xff0c;那么“土著刷题”小&#x1f34a;序绝对值得一试&#xff01;它不仅完全免费&#xff0c;而且操作简单&#xff0c;非常适合用来组织线上测试。 &#x…

使用Angular构建动态Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Angular构建动态Web应用 1 引言 2 Angular简介 3 安装Angular 4 创建Angular项目 5 设计应用结构 6 创建组件 7 …

「Java SPI机制应用快速入门」: 一种JDK内置的服务提供发现机制

文章目录 什么是SPISPI机制的应用使用方法使用规范 入门案例 什么是SPI SPI首先是一种机制&#xff0c;这个机制叫&#xff1a;服务提供发现机制。那是谁来负责发现呢&#xff1f;当然是JDK内置的服务帮助我们发现啦。发现了帮助我们去调用&#xff0c;我们要做的就是在中间去…

2024护理类科技核心期刊汇总(最新版)

2024年9月中国科技核心期刊目录&#xff08;2024年版&#xff09;正式公布&#xff0c;13本护理类期刊入选。常笑医学整理了这13本护理类科技核心期刊的详细参数&#xff0c;以及投稿经验&#xff0c;供大家在论文投稿时参考&#xff0c;有需要的赶紧收藏&#xff01; 1.《中华…

SwiftUI(四)- 布局(VStack、HStack、ZStack)

引言 页面的搭建和布局在应用开发中几乎占据了一半的代码量。定于iOS开发而言&#xff0c;相较于其它平台&#xff0c;UIKit的布局方式显得相对局限&#xff0c;通常只有绝对布局和相对布局两种方案。而在Flutter或者Android开发中&#xff0c;布局选项更为丰富&#xff0c;比…

【mod分享】极品飞车9冬日mod,支持光追,想体验一把冬天的Rockport市吗

各位好&#xff0c;今天小编给大家带来一款新的高清重置魔改MOD&#xff0c;本次高清重置的游戏叫《极品飞车9最高通缉》。 《极品飞车&#xff1a;最高通缉》作为一款2005年的游戏&#xff0c;《极品飞车&#xff1a;最高通缉》的画面效果还是可以的&#xff0c;效果全开之后…

【状态机DP】力扣1186. 删除一次得到子数组最大和

给你一个整数数组&#xff0c;返回它的某个 非空 子数组&#xff08;连续元素&#xff09;在执行一次可选的删除操作后&#xff0c;所能得到的最大元素总和。换句话说&#xff0c;你可以从原数组中选出一个子数组&#xff0c;并可以决定要不要从中删除一个元素&#xff08;只能…

手机拍证件照,换正装有领衣服及底色的方法

证件照在我们的职业生涯的关键节点是经常会用到的&#xff0c;比如毕业入职、人事档案建立、升迁履历、执业资格考试和领证等&#xff0c;这些重要的证件照往往要求使用正装照&#xff0c;有时候手头没有合适的衣服&#xff0c;或者原先的证件照背景色不符合要求&#xff0c;就…

numpy——数学运算

一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…

优选算法精品课--双指针算法(2)

双指针算法&#xff08;2&#xff09; 1、有效三角形的个数1.1 题目解析1.2 思路解析1.3 代码实现 2、和为s的两个数2.1 题目解析2.2 思路解析2.3 代码实现 3、三数之和3.1 题目解析3.2 思路解析3.3 代码实现 4、四数之和4.1 题目解析4.2 思路解析4.3 代码实现 5 总结 1、有效三…