首页 > 其他分享 >FunctionalInterface解析

FunctionalInterface解析

时间:2023-08-12 22:01:18浏览次数:39  
标签:Function Predicate return default FunctionalInterface 参数 解析 other

FunctionalInterface注解

FunctionalInterface`是Java8新增的一个注解,使用`FunctionalInterface`注解的接口被称为`函数式接口
@FunctionalInterface`注解的作用是告知编译器进行检查,可加可不加,但是如果加上了,那么接口必须为`函数式接口

特点

FunctionalInterface的Doc注释可知,函数式接口具有以下特点

upload successful

只能有一个抽象方法,但以下情况不计入

1、Java8自带的default方法

2、一个抽象方法重写了Object的一个公共方法

3、静态方法

比如下面这种情况

upload successful

函数式接口类型

一般在java.util.function包下我们可以看到所有的自带的符合函数式接口的类型,主要有以下几种类型

upload successful

Function

接收一个T类型的参数,返回一个R类型的结果

用法:

map.computeIfAbsent("name", String::length);

Function接口的andThen方法和compose方法

源码:

// 先执行before参数,再执行调用者(参数和调用者都是Function)
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
    Objects.requireNonNull(before);
    return (V v) -> apply(before.apply(v));
}
// 先执行调用者,再执行before参数((参数和调用者都是Function))
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
  	Objects.requireNonNull(after);
  	return (T t) -> after.apply(apply(t));
}

Consumer

接收一个T类型的参数,无返回结果

用法:

list.forEach(System.out::println);

源码:

// 消费参数t,消费规则自己定义
void accept(T t);

// 先执行调用者消费规则,再执行after参数的消费规则
default Consumer<T> andThen(Consumer<? super T> after) {
    Objects.requireNonNull(after);
    return (T t) -> { accept(t); after.accept(t); };
}

Predicate

接收一个T类型的参数,返回一个boolean类型的结果

用法:

list.removeIf(a -> a == 3);

源码:

// 对给定参数执行断定规则,断定规则自己定义,断定结果为boolean
boolean test(T t);

// 先对给定参数执行当前断定规则,再执行other断定规则,两个断定规则都需要符合(可理解为条件A && 条件B),返回为Predicate
default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);
}

// 对test的断定规则取非,返回为Predicate
default Predicate<T> negate() {
  	return (t) -> !test(t);
}

// 先对给定参数执行当前断定规则,再执行other断定规则,两个断定规则符合一个即可(可理解为条件A || 条件B),返回为Predicate
default Predicate<T> or(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) || other.test(t);
}

// 返回一个谓词,用于测试两参数是否相等
static <T> Predicate<T> isEqual(Object targetRef) {
    return (null == targetRef)
      ? Objects::isNull
        : object -> targetRef.equals(object);
}

Supplier

不接收参数,返回一个T类型的结果

用法:

Supplier<Random> randomSupplier = Random::new;

源码:

// 获取结果
T get();

标签:Function,Predicate,return,default,FunctionalInterface,参数,解析,other
From: https://blog.51cto.com/u_11906056/7062226

相关文章

  • openGauss数据库源码解析系列文章——安全管理源码解析(三)
    Gauss松鼠会[openGauss](javascript:void(0);)2023-07-2917:58发表于四川在上篇openGauss数据库源码解析系列文章——安全管理源码解析(一)我们围绕安全管理整体架构和代码概览、安全认证原理介绍和代码解析进行了简单介绍。本篇将继续角色管理、对象权限管理的学习,全文阅读需要3......
  • openGauss数据库源码解析系列文章——安全管理源码解析(四)
    四、对象权限管理权限管理是安全管理重要的一环,openGauss权限管理基于访问控制列表(accesscontrollist,ACL)实现。4.1权限管理1.访问控制列表访问控制列表是实现数据库对象权限管理的基础,每个对象都具有ACL,存储该对象的所有授权信息。当用户访问对象时,只有用户在对象的ACL中并且......
  • 探索Masscan:全面解析高速网络扫描的神兵利器
    在网络安全领域,高速扫描是一项不可或缺的任务,而Masscan作为一款高性能的网络扫描工具,能够以惊人的速度快速探测大规模网络。本篇博客将深入探讨Masscan的各种参数,逐一介绍其用途、特点和实际应用,帮助你充分了解Masscan并发挥其强大威力。Masscan概览Masscan是一款开源、高速的端口......
  • java解析xml获取节点的属性
    1、java解析xml中返回的数据???2、java中dom4j解析xml文件怎么获取节点属性3、详解Java解析XML的四种方法4、使用Java自带SAX工具解析XML5、Java解析XML的几种方法java解析xml中返回的数据???JDOM生成和解析XML为减少DOM、SAX的编码量,出现了JDOM优点:20-80原则,极大减少......
  • Java源码解析-重点集合框架篇
    Java源码解析,集合篇一:故事背景二:数据结构2.1线性结构2.2非线性结构三:集合分类3.1结构图四:详细分析4.1List4.1.1ArrayList4.1.1.1底层结构4.1.1.2主要特点4.1.2LinkedList4.1.2.1底层结构4.1.2.2主要特点4.1.3Vector和Stack4.1.3.1Vector4.1.3.1Stack五:总结提升一:故......
  • 精细解析中文公司名称:智能分词工具助力地名、品牌名、行业词和后缀提取
    精细解析中文公司名称:智能分词工具助力地名、品牌名、行业词和后缀提取中文公司名称分词工具,支持公司名称中的地名,品牌名(主词),行业词,公司名后缀提取。对公司名文本解析,识别并提取地名(place)、品牌名(brand)、行业词(trade)、公司名后缀词(suffix)。[x]补充中国三级地名,优化地名......
  • 精细解析中文公司名称:智能分词工具助力地名、品牌名、行业词和后缀提取
    精细解析中文公司名称:智能分词工具助力地名、品牌名、行业词和后缀提取中文公司名称分词工具,支持公司名称中的地名,品牌名(主词),行业词,公司名后缀提取。对公司名文本解析,识别并提取地名(place)、品牌名(brand)、行业词(trade)、公司名后缀词(suffix)。补充中国三级地名,优化地名提......
  • 【源码解析】postgresql having clause 是如何实现的 (2)
    在上一篇中,主要探究了postgresql源码层面是怎么实现聚合函数的。本篇将探究havingclause是如何实现的。setupcreatetablefoo(aint,bint);insertintofooselectrandom()*i/2,random()*ifromgenerate_series(10,20)g(i);selecta,count(b)fromfoogrou......
  • 解锁Python集合的妙用:常用函数与实例深度解析
    Python的集合(Set)是一种无序且不重复的数据结构,拥有强大的去重和集合运算功能。在这篇博客中,我们将深入探讨集合的常用函数,并通过实际案例为你展示其灵活应用。创建集合集合可以通过花括号来创建,也可以使用内置函数set()来转换其他可迭代对象为集合。#创建集合my_set={1,2,3}......
  • Kafka深度解析
    背景介绍Kafka简介Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下:以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输支持KafkaServer间的......