java之父-新特性

目录

一.函数式接口Functional Interface

1. Supplier接口 --供给型接口

2. Consumer接口 --消费型接口

3.Function接口 --转换型接口

4. Predicate接口--断言型接口

5. Comparator接口--比较器接口


一.函数式接口Functional Interface

只有一个抽象方法的接口(可以定义多个非抽象方法)。可以使用@FunctionalInterface接口定义,强化语义规范。

函数式接口,也被称为SAM 接口(Single Abstract Method Interfaces):

基于函数式接口,可以使用Lambda表达式进行实现,实现函数式编程。

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}

// lambda表达式实现字符串数组排序
Arrays.sort(array, (x1,x2) -> {
    if (x1.length() != x2.length()) {
        return x1.length() - x2.length();
    } else {
        return x1.compareTo(x2);
    }
} );

2:迭代

List<String> langList = Arrays.asList("Basic","QBasic","c","c++","PowerBuilder","Visual Basic");
langList.forEach((name)->{
    System.out.println(name);
});

内置函数式接口来由来

我们知道使用Lambda表达式的前提是需要有函数式接口。而Lambda使用时不关心接口名,抽象方法名,只关心抽象方法的参数列表和返回值类型。因此为了让我们使用Lambda方便,JDK提供了大量常用的函数式接口

求数组的的所有元素和---自定义一个内置函数接口:

package com.itheima.demo03functionalinterface;
import java.util.List;
public class Demo01UserFunctionalInterface {
    public static void main(String[] args) {
        // 调用函数式接口中的方法
        method((arr) -> {
            int sum = 0;
            for (int n : arr) {
                sum += n;
            }
            return sum;
        });
    }
    // 使用自定义的函数式接口作为方法参数
    public static void method(Operator op) {
        int[] arr = {1, 2, 3, 4};
        int sum = op.getSum(arr);
        System.out.println("sum = " + sum);
    }
}
@FunctionalInterface
interface Operator {
    public abstract int getSum(int[] arr);
}

1. Supplier接口 --供给型接口

ava.util.function.Supplier<T> 接口 - 方法没有参数,有返回值--供给型接口。

它意味着"供给" , 对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。

供给型接口,通过Supplier接口中的get方法可以得到一个值,无参有返回的接口。

@FunctionalInterface
public interface Supplier<T> {
    public abstract T get();
}

使用 Supplier 接口作为方法参数类型,通过Lambda表达式求出int数组中的最大值。提示:接口的泛型请使用 java.lang.Integer 类。注意代码的执行顺序

public class Demo02 {
     public static void main(String[] args) {
        System.out.println("进入到main方法");
        //使用lambda表达式表示
        Supplier<Integer> s1 = () -> {

                System.out.println("get方法开始");
                int[] arr = {4,23,3,2,12,9303};
                int index = new Random().nextInt(arr.length);
                System.out.println("get方法结束");
                return arr[index];

        };
        printNumber(s1);
        System.out.println("main方法结束");
    }

    private static void printNumber(Supplier<Integer> sup) {
        System.out.println("随机值为为:");
        System.out.println(sup.get());
        System.out.println("print结束");
    }

}

2. Consumer接口 --消费型接口

java.util.function.Consumer<T> 接口则正好相反 --方法有参数,没有返回值,它不是生产一个数据,而是消费一个数据,其数据类型由泛型参数决定。 --消费型接口

Consumer消费型接口,可以拿到accept方法参数传递过来的数据进行处理, 有参无返回的接口。

@FunctionalInterface 
public interface Consumer<T> { 
    public abstract void accept(T t); 

public class Demo03 {
        // 使用Lambda表达式将一个字符串转成大写的字符串
    public static void main(String[] args) {
        System.out.println("开始啦");
        printHello((String str) -> {
            System.out.println(str.toUpperCase());
        });
    }

    public static void printHello(Consumer<String> consumer) {
        System.out.println("aaa");
        consumer.accept("Hello World");
    }
}

代码练习2默认方法:andThen

如果一个方法的参数和返回值全都是 Consumer 类型,那么就可以实现效果:消费一个数据的时候,首先做一个操 作,然后再做一个操作,实现组合。而这个方法就是 Consumer 接口中的default方法 andThen 。下面是JDK的源代码:

default Consumer<T> andThen(Consumer<? super T> after) {
    Objects.requireNonNull(after);
    return (T t) -> { accept(t); after.accept(t); };//箭头后的为返回Consumer对象中重写的方法体
}
//此时需要注意,我们返回的是一个Lambda表达式,就相当于返回了一个被重写了抽象方法的Consumer<T>类对象
// 即该类对象中,重写了accept()抽象方法,方法体为{ s -> System.out.println(s); s -> System.out.println(new StringBuilder(s).reverse().toString();}
// 即con1.andThen(con2).accept(name);,就变为 Consumer<T>.accept(name);
// Consumer<T>调用本身的accept()方法,并传入字符串参数 “林青霞 ”,所以会输出林青霞,霞青林
// 返回的是一个Consumer类型的对象,而不是直接去对此对象及性能调用

备注: java.util.Objects 的 requireNonNull 静态方法将会在参数为null时主动抛出

NullPointerException 异常。这省去了重复编写if语句和抛出空指针异常的麻烦。

要想实现组合,需要两个或多个Lambda表达式即可,而 andThen 的语义正是“一步接一步”操作。例如两个步骤组合的情况

3.Function接口 --转换型接口

java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件, 后者称为后置条件。有参数有返回值。----- 此方法接收一个参数,加工处理成另一种,称为转换型接口

Function转换型接口,对apply方法传入的T类型数据进行处理,返回R类型的结果,有参有返回的接口。使用的场景 例如:将 String类型转换为 Integer类型。

@FunctionalInterface 
public interface Function<T, R> { 
    public abstract R apply(T t); 

public static void main(String[] args) {
        // 通过lambda表达式方式创建一个Function类型的对象

//        测试1: 返回字符串的长度
//        Function<String, Integer> f = (String str) -> {
//            return str.length();
//        };
        
//          省略写法
        Function<String, Integer> f =  str -> str.length();
        method(f,"abcdef");

//        测试2:截取字符串的前五个字符。转成数字,要求传入的参数类型为数字字符串类型
        Function<String, Integer> f1 = str -> Integer.parseInt(str.substring(0, 2));
        method(f1, "121273asheji");

    }

    /*
     * 函数式接口把一个String转换成数字类型
     */
    public static void method(Function<String, Integer> f, String str) {
        Integer result = f.apply(str);
        System.out.println(result);
    }

默认方法: andThen:该方法同样用于“先做什么,再做什么”的场景,和 Consumer 中的 andThen差不多:

function中有一个默认方法,对应的代码的源码为如下

default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

4. Predicate接口--断言型接口

有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用

java.util.function.Predicate<T> 接口。------接收一个参数,返回一个boolean类型的值,称为判断型接口

@FunctionalInterface 
public interface Predicate<T> { 
    public abstract boolean test(T t); 

Predicate接口用于做判断,返回boolean类型的值

判断某个数字是否是偶数,判断某个数字是否大于0


public class Demo07Predicate {
    public static void main(String[] args) {

        // 通过lambda的方式创建Predicate类型的对象,需要重写test方法
        
        //判断是否是偶数
        Predicate<Integer> p1 = (Integer num) -> {
            System.out.println("是否是偶数");
            return (num & 1) == 0;
        };
        method(p1, 29);
        
        //判断是否>100
        Predicate<Integer> p2 = (Integer num) -> {
            System.out.println("是否>100");
            return num >100;
        };
        method(p2, 100);
    }

    /*
     * 函数式接口作为方法的参数 判断一个数字
     */
    public static void method(Predicate<Integer> p, Integer num) {
        boolean b = p.test(num);
        System.out.println(b);
    }
    

}

默认方法: and or

既然是条件判断,就会存在与、或、非三种常见的逻辑关系。其中将两个 Predicate条件使用“与”逻辑连接起来实 现“并且”的效果时,可以使用default方法 and 。其JDK源码为:


default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

//与 and 的“与”类似,默认方法 or实现逻辑关系中的“或”。JDK源码为:
default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

5. Comparator接口--比较器接口

比较器接口,用于比较指定元素值的大小。Java8版本中,添加了多个新的default方法,用于比较器合并、反转等操作。

// 案例数据
List<String> langList = Arrays.asList("Basic", "QBasic","HTML", "c", "c++", "PowerBuilder", "go", "Visual Basic", "c#","java");

// 按照ASCII码比较
Comparator<String> comparator1 = (s1, s2) -> {
    return s1.compareTo(s2);
};

// 按照长度比较
Comparator<String> comparator2 = (s1, s2) -> {
    return s1.length() - s2.length();
};

// 先比较长度,再比较ASCII码
Comparator<String> comparator3 = comparator2.thenComparing(comparator1);

// 在comparator3的基础上,反转条件
Comparator<String> comparator4 = comparator2.reversed();

// 按照指定Comparator,进行排序
langList.sort(comparator2);

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

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

相关文章

GPT-5的多模态能力如何?

GPT-5的多模态能力如何&#xff1f;概述问题1-非整点闹钟问题2-数数问题一问题3-数数问题二小结概述 2025年&#xff0c;8月8日凌晨&#xff0c;OpenAI 发布了 GPT-5&#xff0c;让我们看看其多模态能力如何&#xff0c;用之前大模型无法解决的题目测试&#xff0c;数数问题时…

多模态RAG赛题实战--Datawhale AI夏令营

参考自科大讯飞AI大赛&#xff08;多模态RAG方向&#xff09; - Datawhale 赛题意义&#xff1a; 我们正处在一个信息爆炸的时代&#xff0c;但这些信息并非以整洁的纯文本形式存在。它们被封装在各种各样的载体中&#xff1a;公司的年度财报、市场研究报告、产品手册、学术论…

SQL Server 创建 PostgreSQL 数据库 链接服务器指南

SQL Server 创建 PostgreSQL 数据库 链接服务器指南SQL Server 创建 PostgreSQL 数据库 链接服务器指南一、准备工作二、创建链接服务器三、测试连接四、常见问题解决五、注意事项SQL Server 创建 PostgreSQL 数据库 链接服务器指南 一、准备工作 安装 PostgreSQL ODBC 驱动&a…

李宏毅深度学习教程 第16-18章 终身学习+网络压缩+可解释性人工智能

【2025版】44、第十四节 机器终身学习 一 为什么今日的人工智能A_哔哩哔哩_bilibili 【2025版】42、第十三节 神经网络压缩 一 类神经网络剪枝PruA_哔哩哔哩_bilibili 【2025版】30、第九节 机器学习的可解释性 上 – 为什么神经网络可以正_哔哩哔哩_bilibili 目录 1. 终生…

LiveQing视频RTMP推流视频点播服务功能-云端录像支持按时间段下载录像时间段下载视频mp4

LiveQing视频RTMP推流视频点播服务功能-云端录像支持按时间段下载录像时间段下载视频mp41、云端录像2、配置云端录像3、查看云端录像3、列表模式4、时间段下载5、时间段下载接口6、RTMP推流视频直播和点播流媒体服务1、云端录像 LiveQing 支持服务器集中录像&#xff0c;将rtm…

Spark在什么情况下CBO才会判断失误,如何避免

在 Spark 中&#xff0c;CBO&#xff08;基于成本的优化器&#xff0c;Cost-Based Optimizer&#xff09;通过分析表的统计信息&#xff08;如行数、列基数、数据分布等&#xff09;计算不同执行计划的“成本”&#xff0c;并选择成本最低的计划。但在以下场景中&#xff0c;CB…

【第12话:感知算法基础4】图像分割:深度学习图像分割模型介绍入门及常用模型详解

深度学习图像分割模型介绍入门及常用模型详解 图像分割是计算机视觉的核心任务&#xff0c;旨在将图像划分为语义区域。随着深度学习的发展&#xff0c;分割模型在精度和效率上取得重大突破。以下按技术演进顺序详解主流模型&#xff1a;1. FCN&#xff08;全卷积网络&#xff…

AI 大模型企业级应用落地挑战与解决方案

引言&#xff1a;AI 大模型的企业价值与落地困境近年来&#xff0c;以 GPT-4、Claude 3、文心一言为代表的大语言模型&#xff08;LLM&#xff09;展现出惊人的自然语言理解与生成能力&#xff0c;吸引了众多企业的关注。据 Gartner 预测&#xff0c;到 2025 年&#xff0c;40%…

微服务如何保证系统高可用?

今天我们来探讨一个综合性但至关重要的话题&#xff1a;给你一个微服务应用&#xff0c;你该如何系统性地保证其高可用性&#xff1f;在互联网技术岗的面试中&#xff0c;高并发、高可用和大数据通常被视为衡量候选人经验的三大黄金标准。但说实话&#xff0c;是否拥有真正的高…

推理路径的动态调控:让大模型学会“恰到好处”的思考

当前大型语言模型&#xff08;LLM&#xff09;通过思维链&#xff08;CoT&#xff09;提升复杂任务推理能力&#xff0c;但研究表明其推理路径存在严重冗余——例如反复验证或无效思维跳跃&#xff0c;导致计算资源浪费和“幻觉”增加。论文&#xff1a;Test-time Prompt Inter…

springboot 2.4跨域变化和swagger结合的问题

前言 最近升级老项目&#xff0c;springboot2.2升级2.x最新版&#xff0c;升级项目本身升级很正常&#xff0c;毕竟springboot升级3.x以下&#xff0c;升级3.x需要spring6.x&#xff0c;需要jdk17.但是升级的项目在自测时正常&#xff0c;一旦真正测试就报跨域问题了。排查才发…

AWT 基本组件深入浅出:Button/Label/TextField/Checkbox/Choice/List 全面实战与性能优化

Java AWT 基本组件的原理与用法&#xff0c;提供可运行示例、布局最佳实践、事件处理与“性能优化”建议&#xff0c;帮助你快速构建稳定的桌面界面。 Java AWT, GUI, Button, Label, TextField, Checkbox, CheckboxGroup, Choice, List, 事件处理, 布局管理器, 性能优化 AWT…

逻辑回归详解:原理、应用与实践

逻辑回归详解&#xff1a;原理、应用与实践1. 逻辑回归的基本原理1.1 线性回归部分1.2 Sigmoid函数1.3 决策边界2. 逻辑回归的损失函数3. 逻辑回归的应用场景4. 逻辑回归的优缺点4.1 优点4.2 缺点5. 使用scikit-learn实现逻辑回归6. 逻辑回归的改进与扩展6.1 正则化6.2 多分类扩…

嵌入式硬件接口总结

嵌入式系统的核心在于其硬件与软件的无缝协作&#xff0c;而硬件接口是实现这种协作的物理和逻辑桥梁。它们定义了微控制器、处理器、传感器、执行器、存储器以及其他外设之间如何交换数据、电信号和控制信息。 核心概念 接口的定义&#xff1a; 两个独立系统或组件之间进行通信…

《算法导论》第 14 章 - 数据结构的扩张

大家好&#xff01;今天我们来深入学习《算法导论》第 14 章 —— 数据结构的扩张。这一章主要介绍了如何基于现有数据结构&#xff08;如二叉搜索树&#xff09;扩展出新的功能&#xff0c;以满足更复杂的问题需求。我们会从动态顺序统计树讲到区间树&#xff0c;每个知识点都…

Vue 3.6 Vapor模式完全指南:告别虚拟DOM,性能飞跃式提升

什么是 Vapor 定义: Vue 3.6 新增的编译/渲染模式&#xff0c;不再构建/对比虚拟 DOM&#xff0c;而是将模板编译为“直达 DOM 的更新代码”&#xff0c;以更低内存与更快更新获得接近 Solid/Svelte 的性能。特点更快: 跳过 VDOM 创建与 diff&#xff0c;直接按依赖精准更新。…

Java类和对象课上练习题目设计

我们可以做一个简易银行账户类&#xff0c;支持存款、取款、查看交易记录等。 示例&#xff1a;BankAccount 类 java 复制 编辑 public class BankAccount { private String accountNumber; // 账号 private String ownerName; // 开户人姓名 private double balance; …

Python数据双效处理:同步转换与换算的高级技术与工程实践

引言&#xff1a;转换与换算在现代数据处理中的核心价值在大数据与实时处理需求激增的时代&#xff0c;高效的数据处理方案成为核心竞争力。根据2025年Python数据工程调查报告&#xff1a;75%的数据处理任务需要同时执行转换和换算操作优化良好的双效处理可提升3-8倍性能关键应…

Go语言实战案例:文件上传服务

在 Web 开发中&#xff0c;文件上传 是常见需求&#xff0c;例如头像上传、文档存储、图片分享等功能。Go 语言的标准库 net/http 已经内置了对 multipart/form-data 类型的支持&#xff0c;能让我们轻松构建一个文件上传服务。本文将带你实现一个可运行的文件上传接口&#xf…

【Lua】常用的库

os库&#xff1a;os.time() -- 输出当前时间的时间戳 os.time({year 2014, month 8, day 14}) -- 获取指定时间的时间戳local nowTime os.date("*t") -- 以表的形式获取当前的时间信息for k,v in pairs(nowTime) doprint(k,v) end--以上for循环示例输出 {year 2…