iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >基于Consumer接口、Predicate接口初使用是怎样的
  • 449
分享到

基于Consumer接口、Predicate接口初使用是怎样的

2023-06-22 03:06:54 449人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关基于Consumer接口、Predicate接口初使用是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Consumer 接口源码package j

这篇文章将为大家详细讲解有关基于Consumer接口、Predicate接口初使用是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Consumer 接口

源码

package java.util.function;import java.util.Objects;@FunctionalInterfacepublic interface Consumer<T> {    void accept(T t);        default Consumer<T> andThen(Consumer<? super T> after) {        Objects.requireNonNull(after);        return (T t) -> { accept(t); after.accept(t); };    }}

从源码中可以得到,Consumer 接口是函数式接口,并且这个函数式接口的唯一抽象方法是没有返回值的,也许大家会有疑惑,没有返回值,那这个接口有什么用呢?当然,这个接口不会给我们返回什么值,但是我们可以用来修改传递过来的参数啊,这样比直接修改又多了什么优点呢?额,自己挖坑?我也说不上来多了什么优点,我还很弱,不过我喜欢这种编程方式。

直接使用 accept()

举个例子,假如用户的 name 为 null,那么就可以给他设置一个默认的 name ,想不到好的例子,感觉这个例子不是很合理,但是意思差不多。

User.java:

package entity;public class User {    // 用户默认名字    public static final String  DEFAULT_NAME = "Kaven";    // 用户的年龄    private int age;    // 用户的名字    private String name;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

testConsumer.java:

package test;import entity.User;import java.util.function.Consumer;public class testConsumer{    public static void main(String[] args){        Consumer<User> consumer = user -> user.setName(User.DEFAULT_NAME);        User user = new User();        if(user.getName() == null) consumer.accept(user);        System.out.println(user.getName());    }}

输出:Kaven

使用 andThen()

从源码可以得到,this 进行 accept() 后,after 再进行 accept(),相当于进行了两次 accept() 。

default Consumer<T> andThen(Consumer<? super T> after) {        Objects.requireNonNull(after);        return (T t) -> { accept(t); after.accept(t); };    }

下面以小学成绩单为例,假设小学成绩单是由两门单科成绩(语文、数学)和总分组成,当我们需要修改其中一门成绩的时候,我们是不是也需要修改总分呢?这是肯定的啊。当然,这个例子也不是很合理。

Grade.java:

package entity;public class Grade {    // 语文成绩    private int chinese_language;    // 英语成绩    private int english;    // 总分    private int total_score;    public Grade(int chinese_language, int english){        this.chinese_language = chinese_language;        this.english = english;        this.total_score = chinese_language + english;    }    public int getChinese_language() {        return chinese_language;    }    public void setChinese_language(int chinese_language) {        this.chinese_language = chinese_language;    }    public int getEnglish() {        return english;    }    public void setEnglish(int english) {        this.english = english;    }    public int getTotal_score() {        return this.total_score;    }    public void setTotal_score() {        this.total_score = this.chinese_language + this.english;    }}

testConsumerAndThen.java:

package test;import entity.Grade;import java.util.function.Consumer;public class testConsumerAndThen {    public static void main(String[] args){        Consumer<Grade> total_score = grade -> {            grade.setTotal_score();        };        Consumer<Grade> english = grade -> {            grade.setEnglish(80);        };        Grade grade = new Grade(80,70);        System.out.printf("英语成绩为:%d\n",grade.getEnglish());        System.out.printf("总分为:%d\n",grade.getTotal_score());        english.andThen(total_score).accept(grade);        System.out.println("修改英语成绩后---------------");        System.out.printf("英语成绩为:%d\n",grade.getEnglish());        System.out.printf("总分为:%d\n",grade.getTotal_score());    }}

输出:

英语成绩为:70
总分为:150
修改英语成绩后---------------
英语成绩为:80
总分为:160

Predicate 接口

源码

package java.util.function;import java.util.Objects;@FunctionalInterfacepublic interface Predicate<T> {    boolean test(T t);    default Predicate<T> and(Predicate<? super T> other) {        Objects.requireNonNull(other);        return (t) -> test(t) && other.test(t);    }    default Predicate<T> negate() {        return (t) -> !test(t);    }    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);    }}

Predicate 接口也是函数式接口,调用接口的 test 方法会返回一个布尔类型的值,其实从 Predicate 接口的源码中也可以看出来,这个接口的用处是什么。

以我的理解,是可以用来判断传递过来的参数是否匹配一些条件。

使用 test()

我们还是使用 Consumer 接口的例子,当用户的 name 为 null 时,给用户设置默认的 name。

我们可以用 Predicate 接口来判断用户的 name 是否为空,可能看起来比直接比较麻烦一点。

testPredicate.java:

package test;import entity.User;import java.util.function.Consumer;import java.util.function.Predicate;public class testPredicate {    public static void main(String[] args){        Consumer<User> consumer = user -> user.setName(User.DEFAULT_NAME);        Predicate<User> predicate = user -> {            return user.getName() == null ;        };        User user = new User();        if(predicate.test(user)) consumer.accept(user);        System.out.println(user.getName());    }}

输出:Kaven

一样的效果。

使用 negate()

从源码中可以得到,negate() 是返回一个对 test() 的结果取一次反的 Predicate 实例。

default Predicate<T> negate() {        return (t) -> !test(t);}

也可以这样用,负负得正不是吗。

if(!predicate.negate().test(user)) consumer.accept(user);

使用 and()

and() 返回一个对两个 test() 以 && 的方式的 Predicate 实例。

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

在 User.java 里面加一个用户默认年龄属性。

 // 用户默认年龄    public static final int DEFAULT_AGE = 20;

当用户年龄不符合情况并且名字为空时,就重新设置用户的年龄和名字。

testPredicate.java:

package test;import entity.User;import java.util.function.Consumer;import java.util.function.Predicate;public class testPredicate {    public static void main(String[] args){        Consumer<User> consumer = user -> user.setName(User.DEFAULT_NAME);        Consumer<User> consumer_age = user -> user.setAge(User.DEFAULT_AGE);        Predicate<User> predicate = user -> {            return user.getName() == null ;        };        Predicate<User> predicate_age = user -> {            int age = user.getAge();            return  (age <= 0 || age >=150);        };        User user = new User();        if(predicate.and(predicate_age).test(user)) consumer.andThen(consumer_age).accept(user);        System.out.println(user.getName());        System.out.println(user.getAge());    }}

输出:

Kaven
20

Predicate接口还有两个方法:

  • or()

or() 方法应该很容易理解,or() 返回一个对两个 test() 以 || 的方式的 Predicate 实例。

default Predicate<T> or(Predicate<? super T> other) {        Objects.requireNonNull(other);        return (t) -> test(t) || other.test(t);}
  • isEqual()

接口的静态方法,看源码也很容易理解,生成一个判断是否与 targetRef equal的 Predicate 实例。targetRef 不为 null 时,如果 targetRef 这个实例的类中没有重载 Object 类的 equals() 方法或者 targetRef 这个实例本身就是 Object 类的实例,就会使用 Object 类的 equals() 进行判断,就只会判断传递过来的参数的引用是否与 targetRef 一样,和 == 相同。

static <T> Predicate<T> isEqual(Object targetRef) {        return (null == targetRef)                ? Objects::isNull                : object -> targetRef.equals(object);}

从 Object 类的源码也很容易看出来,equals() 就是直接使用的 == 进行判断的。

public boolean equals(Object obj) {     return (this == obj);}

要想使用自己的 equals() 进行判断,就在 targetRef 实例的类中重写 equals() 方法。

比如在 User.java 中重写 equals():

@Override    public boolean equals(Object obj) {        if(obj == null) return false;        else{            if(obj instanceof User){                User user = (User) obj;                // String 类已经重载了 equals()                if(this.name.equals((user).name) && this.age == user.age) return true;                else return false;            }            else return false;        }    }

使用 or()、isEqual()

package test;import entity.User;import java.util.function.Consumer;import java.util.function.Predicate;public class testPredicate {    public static void main(String[] args){        Consumer<User> consumer = user -> user.setName(User.DEFAULT_NAME);        Consumer<User> consumer_age = user -> user.setAge(User.DEFAULT_AGE);        Predicate<User> predicate = user -> {            return user.getName() == null ;        };        Predicate<User> predicate_age = user -> {            int age = user.getAge();            return  (age <= 0 || age >=150);        };        User user = new User();        user.setAge(21);        if(predicate.or(predicate_age).test(user)) consumer.andThen(consumer_age).accept(user);//        if(predicate.and(predicate_age).test(user)) consumer.andThen(consumer_age).accept(user);//        if(!predicate.negate().test(user)) consumer.accept(user);//        if(predicate.test(user)) consumer.accept(user);        User user_equal = new User(User.DEFAULT_AGE , User.DEFAULT_NAME);        System.out.println(Predicate.isEqual(user).test(user_equal));        System.out.println(user.equals(user_equal));        System.out.println(user.getName());        System.out.println(user.getAge());    }}

输出:

true
true
Kaven
20

关于基于Consumer接口、Predicate接口初使用是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 基于Consumer接口、Predicate接口初使用是怎样的

本文链接: https://www.lsjlt.com/news/302342.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Consumer接口、Predicate接口初使用是怎样的
    这篇文章将为大家详细讲解有关基于Consumer接口、Predicate接口初使用是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Consumer 接口源码package j...
    99+
    2023-06-22
  • 基于Consumer接口、Predicate接口初使用
    目录Consumer 接口源码直接使用 accept()使用 andThen()Predicate 接口源码使用 test()使用 negate()使用 and()使用 or()、i...
    99+
    2024-04-02
  • 怎样使用H5的通用接口
    这篇文章将为大家详细讲解有关怎样使用H5的通用接口,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先说几个基本类型: DOMString, boolean, long, u...
    99+
    2024-04-02
  • 基于FMC接口的Kintex-7 XC7K325T PCIeX8 3U PXIe接口卡
    基于FMC接口的Kintex-7 XC7K325T PCIeX8 3U PXIe接口卡...
    99+
    2023-06-05
  • jmeter接口测试流程是怎样的
    这篇文章主要介绍“jmeter接口测试流程是怎样的”,在日常操作中,相信很多人在jmeter接口测试流程是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jmeter接口测试流程是怎样的”的疑惑有所帮助!...
    99+
    2023-06-21
  • 怎么解析基于微信官方接口开发的域名检测接口API
    这期内容当中小编将会给大家带来有关怎么解析基于微信官方接口开发的域名检测接口API,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。域名检测接口是腾讯发布的微信域名状态查询接口,可实时查询域名在微信中的状态,...
    99+
    2023-06-04
  • 用于测试的 golang 接口
    php小编草莓为您介绍一款用于测试的golang接口。在软件开发过程中,测试是不可或缺的环节,而这款接口则提供了便捷的测试功能。通过该接口,开发人员可以快速检验代码的正确性和稳定性,提...
    99+
    2024-02-09
  • SpringCloud基于Feign的可编程式接口怎么调用
    今天小编给大家分享一下SpringCloud基于Feign的可编程式接口怎么调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-30
  • 如何使用Python基于接口编程的方法实现
    目录先通过一个实例来了解下接口到底解决什么问题。 定义一个接口 定义类,继承接口Python 抽象基类的介绍 (PEP3119) 软件行业,唯一不变的就是变化。产品经理会变,产品需求...
    99+
    2024-04-02
  • BaseMapper接口的使用
    Java知识点总结:想看的可以从这里进入 目录 3、相关方法3.1、BaseMapper接口3.1.1、新增3.1.2、删除3.1.3、修改3.1.4、查询 3、相关方法 3.1、BaseMapper接...
    99+
    2023-08-17
    mybatis java spring
  • 怎么基于JWT实现接口的授权访问
    本篇内容主要讲解“怎么基于JWT实现接口的授权访问”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么基于JWT实现接口的授权访问”吧! 什么是JWTJWT(JSON Web Token...
    99+
    2023-06-29
  • 怎么使用API接口
    这篇文章主要介绍“怎么使用API接口”,在日常操作中,相信很多人在怎么使用API接口问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用API接口”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!接口交互前...
    99+
    2023-06-16
  • Go接口怎么使用
    本篇内容主要讲解“Go接口怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go接口怎么使用”吧!接口用法简介接口(interface)是一种类型,用来定义行为(方法)。type ...
    99+
    2023-06-30
  • 基于PHP的快递查询接口查询
    一、接口申请 通过聚合https://www.juhe.cn/docs/api/id/43自助申请开通接口权限。 二、通过PHP发起快递查询 class JuheExpress { private $apiKey = '******...
    99+
    2024-04-02
  • 基于 Redis 实现接口限流的方式
    目录基于 Redis 实现接口限流1. 准备工作2. 限流注解3. 定制 RedisTemplate4. 开发 Lua 脚本5. 注解解析6. 接口测试7. 全局异常处理总结基于 R...
    99+
    2024-04-02
  • 基于Java接口回调的示例分析
    基于Java接口回调的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java接口回调产生接口回调的场景在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事...
    99+
    2023-06-22
  • 关于接口ApplicationContext中的getBean()方法使用
    目录getBean一共有以下四种方法原型第一种:l getBean(String name)第二种:l getBean(Class<T> type)第三种:l getBe...
    99+
    2024-04-02
  • TypeScript接口怎么使用
    这篇文章主要讲解了“TypeScript接口怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“TypeScript接口怎么使用”吧!前言:TS的核心原则之一就是对所具有的结构 进行类型检...
    99+
    2023-06-22
  • java.sql.ResultSetMetaData接口怎么使用
    java.sql.ResultSetMetaData接口是用于描述ResultSet中的元数据的接口。它提供了一些方法来获取和操作R...
    99+
    2023-10-23
    java
  • java对接支付宝支付接口开发是怎样的
    本篇文章为大家展示了java对接支付宝支付接口开发是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。第一步(先要在支付宝进行操做,拿到我们需要开发的信息后在动代码)进入蚂蚁金服,我们先要创建应用...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作