广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于Consumer接口、Predicate接口初使用
  • 501
分享到

基于Consumer接口、Predicate接口初使用

2024-04-02 19:04:59 501人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录Consumer 接口源码直接使用 accept()使用 andThen()Predicate 接口源码使用 test()使用 negate()使用 and()使用 or()、i

Consumer 接口

源码


package java.util.function;
import java.util.Objects;
@FunctionalInterface
public 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;
@FunctionalInterface
public 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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 基于Consumer接口、Predicate接口初使用

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

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

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

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

下载Word文档
猜你喜欢
  • 基于Consumer接口、Predicate接口初使用
    目录Consumer 接口源码直接使用 accept()使用 andThen()Predicate 接口源码使用 test()使用 negate()使用 and()使用 or()、i...
    99+
    2022-11-12
  • 基于Consumer接口、Predicate接口初使用是怎样的
    这篇文章将为大家详细讲解有关基于Consumer接口、Predicate接口初使用是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Consumer 接口源码package j...
    99+
    2023-06-22
  • 基于FMC接口的Kintex-7 XC7K325T PCIeX8 3U PXIe接口卡
    基于FMC接口的Kintex-7 XC7K325T PCIeX8 3U PXIe接口卡...
    99+
    2023-06-05
  • 基于Java接口回调详解
    目录Java接口回调产生接口回调的场景什么是接口回调在代码中的使用Java接口回调测试接口类实现类回调实现测试Java接口回调 产生接口回调的场景 在现实生活中,产生接口回调的场景很...
    99+
    2022-11-12
  • 基于Android AIDL进程间通信接口使用介绍
    AIDL:Android Interface Definition Language,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。 I...
    99+
    2022-06-06
    通信接口 aidl 通信 接口 Android
  • 基于Java接口回调的示例分析
    基于Java接口回调的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java接口回调产生接口回调的场景在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事...
    99+
    2023-06-22
  • 基于Python的接口测试框架实例
    背景 最近公司在做消息推送,那么自然就会产生很多接口,测试的过程中需要调用接口,我就突然觉得是不是可以自己写一个测试框架? 说干就干,由于现有的接口测试工具Jmeter、SoupUI等学习周期有点长,干脆自...
    99+
    2022-06-04
    框架 实例 接口
  • 基于PHP的快递查询接口查询
    一、接口申请 通过聚合https://www.juhe.cn/docs/api/id/43自助申请开通接口权限。 二、通过PHP发起快递查询 class JuheExpress { private $apiKey = '******...
    99+
    2022-10-22
  • 基于 Redis 实现接口限流的方式
    目录基于 Redis 实现接口限流1. 准备工作2. 限流注解3. 定制 RedisTemplate4. 开发 Lua 脚本5. 注解解析6. 接口测试7. 全局异常处理总结基于 R...
    99+
    2022-11-13
  • 如何使用Python基于接口编程的方法实现
    目录先通过一个实例来了解下接口到底解决什么问题。 定义一个接口 定义类,继承接口Python 抽象基类的介绍 (PEP3119) 软件行业,唯一不变的就是变化。产品经理会变,产品需求...
    99+
    2022-11-12
  • 怎么解析基于微信官方接口开发的域名检测接口API
    这期内容当中小编将会给大家带来有关怎么解析基于微信官方接口开发的域名检测接口API,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。域名检测接口是腾讯发布的微信域名状态查询接口,可实时查询域名在微信中的状态,...
    99+
    2023-06-04
  • 基于Restful接口调用方法总结(超详细)
    由于在实际项目中碰到的restful服务,参数都以json为准。这里我获取的接口和传入的参数都是json字符串类型。发布restful服务可参照文章 Jersey实现Restful服务(实例讲解),以下接口调用基于此服务。基于发布的Rest...
    99+
    2023-05-31
    restful 接口 调用
  • 基于Spring接口集成Caffeine+Redis两级缓存
    目录前言改造JSR107 规范CacheCacheManager配置&使用分布式环境改造定义消息体Redis消息配置消息消费逻辑修改DoubleCache测试总结前言 在上一...
    99+
    2022-11-13
  • 基于PHP|JAVA|C#的多语言1688API接口的接入示例
    PHP:是一门广泛应用于Web开发的编程语言,它的特点是易学易用,支持面向对象编程,以及与多种数据库互动能力。 PHPSdk:是一组用于PHP开发者的SDK工具,提供了跨多个平台的调用接口和功能类库。 Java:是一种跨平台的面向对象编程语...
    99+
    2023-09-10
    c# php java
  • SpringCloud基于Feign的可编程式接口调用实现
    目录前言一、基本使用1.引依赖2.加注解3.声明接口4.调用二、进阶1.日志配置2.性能优化前言 Feign 可以替代 RestTemplate 完成可编程式接口调用,并且内部集成 ...
    99+
    2022-11-13
  • SpringCloud基于Feign的可编程式接口怎么调用
    今天小编给大家分享一下SpringCloud基于Feign的可编程式接口怎么调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-30
  • 基于MPSOC ZU15EG+TMS320C6678的双FMC接口通用计算卡
    ZU15EG计算卡学习资料:基于MPSOC ZU15EG+TMS320C6678的双FMC接口通用计算卡...
    99+
    2023-06-05
  • 关于接口ApplicationContext中的getBean()方法使用
    目录getBean一共有以下四种方法原型第一种:l getBean(String name)第二种:l getBean(Class<T> type)第三种:l getBe...
    99+
    2022-11-13
  • 基于PHP的全国天气预报接口查询
    一、接口申请 通过聚合https://www.juhe.cn/docs/api/id/39自助申请开通接口权限。 二、通过PHP发起城市天气查询 // 请求的接口URL $apiUrl = 'http://v.juhe.cn/weath...
    99+
    2022-10-22
  • 基于GO的免费天气预报接口查询
    1、开通接口 天气预报接口服务使用的聚合数据提供的免费接口,每天可以100次免费调用。可以通过https://www.juhe.cn/docs/api/id/73注册及开通。 2、通过Go发起城市天气查询 package main imp...
    99+
    2022-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作