JDK8-1-Lambda表达式(3)-函数式接口

news2024/11/28 13:37:11

JDK8-1-Lambda表达式(3)-函数式接口

有且仅有一个抽象方法的接口称为函数式接口,上文 中 java.util.function.Predicate 接口就是一个函数式接口,Java 8中引入的函数式接口定义在 java.util.function 包下

java.util.function.Predicate

java.util.function.Predicate接口定义了一个名叫test的抽象方法,它接受泛型 T 对象,并返回一个boolean。

@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);

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

java.util.function.Consumer

java.util.function.Consumer定义了一个名叫accept的抽象方法,它接受泛型 T 的对象,没有返回(void)。你如果需要访问类型T的对象,并对其执行某些操作,就可以使用这个接口。

@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);
    
    //省略 。。。
}

java.util.function.Function

java.util.function.Function<T, R>接口定义了一个叫作apply的方法,它接受一个泛型 T 的对象,并返回一个泛型R的对象。如果你需要定义一个Lambda,将输入对象的信息映射到输出,就可以使用这个接口(比如提取苹果的重量,或把字符串映射为它的长度)。

@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);
    
    //省略 。。。
}

以下代码表示将一个String列表映射到包含每个String长度的Integer列表:

// [7, 2, 6] 
List<Integer> l = Arrays.asList("lambdas","in","action")
                .stream()
                .map((String s) -> s.length())
                .collect(Collectors.toList());

java.util.function.Supplier

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

@FunctionalInterface

查看 Java 8 API 发现函数式接口都带有 @FunctionalInterface 注解,但要注意的是函数式接口的定义为有且仅有一个抽象方法的接口,所以申明一个函数式接口只要满足这个定义而并不一定要加上 @FunctionalInterface 注解。

需要注意的是这个标注用于表示该接口会设计成一个函数式接口。如果你用@FunctionalInterface定义了一个接口,而它却不是函数式接口的话,编译器将返回一个提示原因的错误。

如果接口中有其他方法,需要提供默认实现,如下:

default 方法(默认方法)

在前面的例子中我们使用了stream api,如下:

List<Apple> greenApples = apples.stream()
                .filter(apple -> "green".equals(apple.getColor()))
                .collect(Collectors.toList());

从Java API 中可知,stream 方法是 java.util.Collection 接口 1.8 新定义的,并且默认提供了实现,假设一下如果 JDK8 在接口中没有提供默认实现,那么升级JDK后依赖这个接口的第三方框架或者现有代码就会编译失败,可以说 default 方法 给接口设计者提供了一个扩充接口的方式,而不会破坏现有的代码


/**
 * Returns a sequential {@code Stream} with this collection as its source.
 *
 * <p>This method should be overridden when the {@link #spliterator()}
 * method cannot return a spliterator that is {@code IMMUTABLE},
 * {@code CONCURRENT}, or <em>late-binding</em>. (See {@link #spliterator()}
 * for details.)
 *
 * @implSpec
 * The default implementation creates a sequential {@code Stream} from the
 * collection's {@code Spliterator}.
 *
 * @return a sequential {@code Stream} over the elements in this collection
 * @since 1.8
 */
default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

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

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

相关文章

【PWN · ret2text 格式化字符串漏洞 | NX | Canary | PIE】[深育杯 2021]find_flag

这一题最终的攻击手段可以是简单的ret2text&#xff08;后门函数给出&#xff09;&#xff0c;然而保护全开则确实让人汗颜。。。 更重要的是&#xff01;docker的程序偏移和本地不一样&#xff01;&#xff01;NSSCTF题目有问题&#xff01;&#xff01; 目录 前言 一、题目…

openEuler22+GreatSQL+dbops玩转MGR

芬达&#xff0c;《芬达的数据库学习笔记》公众号作者&#xff0c;开源爱好者&#xff0c;擅长 MySQL、ansible。 背景 openEuler 是什么 openEuler22.03 LTS 是 openEuler 社区于 2022 年 3 月发布的开源操作系统&#xff08;从系统版本的命名不难发现吧&#xff09;。openE…

apktool for mac

安装步骤 1、Apktool下载 安装apktool Apktool下载 macOS: Download Mac wrapper script (Right click, Save Link As apktool)Download apktool-2 (find newest here)Rename downloaded jar to apktool.jarMove both files (apktool.jar & apktool) to /usr/local/bin …

sqoop系列:sqoop(离线数据同步)开发案例

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;Mysql(RDBMS)与Hive/HDFS数据传输 1.1&#xff1a;列出MySQL数据有哪些数据库&#xff1a; 1.2&#xff1a;根据mysql表结构创建hive表 1.3: RDBMS导入到hdfs &#xff08;1&#xff09;条件导入 &#xff08;2&…

cisp证书含金量如何网络安全渗透测试工程师主要工作是什么?前景如何?

sp&#xff0c;国家注册信息安全专业工作员&#xff0c;由中国信息安全测评中心认证&#xff0c;作为我国目前网络安全认证之一&#xff01;cisp属于国家测评中心授予&#xff0c;目前遭到企业认可。 CISP在大部分网络安全行业变成了应聘求职的必考的证书。在信息安全行业&…

CentOS 7安装 Postgres

零、前置条件 系统CentOS 7&#xff0c;并已联网&#xff0c;已安装gcc或者g编译器&#xff0c;GNU make版本3.80或以上&#xff0c;系统有至少一个除root之外的普通用户user gcc安装-参考链接查看make命令的版本——make --version更新make版本-参考链接postgresql的使用一般…

年薪百万的高性能计算工程师很难学吗?听OpenBLAS创始人怎么说 ..

想要成为一名高性能计算工程师&#xff0c;入门并掌握相关基础并不困难。 关键在于兴趣和自驱力&#xff0c;因为这是一个偏向底层开发的领域&#xff0c;需要扎实的C和C编程基础。 另外&#xff0c;数学能力也很重要&#xff0c;因为算法开发涉及一些基础的数学知识。对于大部…

【支付平台】java springboot 通过ip获取所在地城市信息

如果只是想知道如何通过ip获取所在地城市信息,可直接看第三步. 如果搭建自己的支付平台,异地支付限制是必不可少的一环.因为市面上一些非法份子,会使用我们平台生成的付款码进行欺诈行为.这也是我们必须杜绝的一种现象.因此限制异地支付就是其中一种手段. 在上一篇文章【三方支…

Golang context 实现原理与源码解读

0 context入门介绍 context是Golang应用开发常用的并发控制技术&#xff0c;主要在异步场景中用于实现并发协调以及对 goroutine 的生命周期控制&#xff0c;它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力&#xff0c;它可以控制多级的goroutine。 con…

【Android】WMS(一)Window的类型和标志

Window、WindowManager、WMS区别 Window&#xff1a; Window 是 Android 中的一个视图容器&#xff0c;代表整个屏幕或 Activity 的一部分。每个 Window 都有自己的 Surface 对象&#xff0c;Surface 对象具有绘制和渲染功能&#xff0c;可以显示 View 和其他元素。在 Android…

Vue 的基础知识 - 判断, 循环, 事件, 通信

目录 1. 了解 Vue 七大常用属性 2. 文本插值 2.1 v-bind 绑定元素 3. 判断 4. 循环 5. 事件 6. 双向绑定 7. 自定义组件 8. Axios 异步通信 8.1 什么是Axios 8.2 为什么要使用 Axios 8.3 Axios 的简单应用 8.4 Vue 的生命周期 1. 了解 Vue 七大常用属性 1. el 属性…

Qt扫盲-Bar柱状图理论

Bar柱状图理论 一、QAbstractBarSeries1. 常用设置2. 管理 BarSet 二、QBarSerie 和 QHorizontalBarSeries1. 垂直柱状图2. 水平柱状图 二、QPercentBarSeries 和 QHorizontalPercentBarSeries1. 垂直比例图2. 水平比例图 三、QStackedBarSeries 和 QHorizontalStackedBarSerie…

忠诚之源:如何获得铁粉?

文章目录 一、铁粉二、如何吸引和留住铁粉的想法2.1 了解你的目标铁粉2.2 提供有价值的内容2.3 建立良好的关系2.4 持续优化和创新 三、具体可采用的一些方法3.1 提供优质内容3.2 社交媒体互动3.3 创建独特的品牌形象3.4 提供特殊待遇和奖励3.5 参与社区和活动3.6 持续互动和更…

如何把视频语音转换成文字,分享给大家几个免费的方法!

在日常工作和学习中&#xff0c;有时需要将视频中的语音转录为文字&#xff0c;以便整理成文稿或进行其他用途。手动打字效率低下且耗时费力&#xff0c;那么如何快速将语音转换为文字呢&#xff1f;下面介绍几种简单高效的方法&#xff0c;其中之一是使用记灵在线工具。 方法…

PHP的流程控制语句

一.流程控制语句 1.if语句 PHP的if语句格式如下 if(表达式) 语句; 如果表达式的值为真&#xff0c;那么久顺序执行语句&#xff1b;否则&#xff0c;就会跳过该条语句&#xff0c;再往下执行。如果要执行的语句不指一条则用{}&#xff0c;{}被称为语句组&#xff0c;格式如…

Immer编写简洁的更新state逻辑

react官网推荐库use-immer&#xff1a;https://www.npmjs.com/package/use-immer 引入&#xff1a;import { useImmer } from "use-immer"; 优点&#xff1a; 简化代码: 只需要关注需要变动的部分&#xff0c;而 immer 本身将在后台处理其余部分。学习成本和替换代…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用

查看原文>>>双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用 目录 第一讲、DNDC模型介绍 第二讲、DNDC初步操作 第三讲、遥感和GIS基础 第四讲、DNDC气象数据 第五讲、DNDC土地数据 第六讲、DNDC土壤数据 …

【C语言】算法学习·Dijkstra算法详解

目录 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 ​使用优先队列的完整代码 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法是解决**单源最短路径**问题的**贪心算法** …

2021年国赛高教杯数学建模C题生产企业原材料的订购与运输解题全过程文档及程序

2021年国赛高教杯数学建模 C题 生产企业原材料的订购与运输 原题再现 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料,总体可分为 A&#xff0c;B&#xff0c;C 三种类型。该企业每年按 48 周安排生产&#xff0c;需要提前制定 24 周的原材料订购和…

如何在 javascript 中按属性值查找数组中的对象

文章目录 使用 find() 方法按属性值在数组中查找对象使用 filter() 方法按属性值查找数组中的对象使用 JavaScript for 循环按属性值查找数组中的对象使用 JavaScript for...in 循环按属性值查找数组中的对象 数组指的是值的有序列表&#xff0c;每个值称为由索引指定的元素。 …