Java8-Function-Consumer-Predicate

2024-05-26 05:38

本文主要是介绍Java8-Function-Consumer-Predicate,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

函数式接口

概念:

针对函数式编程接口,一般可以定义为:

Consumer c = (o) -> {System.out.println(o);
};  // 函数式编程接口都只有一个抽象方法,因此在采用这种写法时,编译器会将这段函数编译后当作该抽象方法的实现
// 如果接口有多个抽象方法,编译器就不知道这段函数应该是实现哪个方法的了。
// 因此,=后面的函数体我们就可以看成是accept函数的实现。

输入:->前面的部分,即被()包围的部分。此处只有一个输入参数,实际上输入是可以有多个的,如两个参数时写法:(a, b);当然也可以没有输入,此时直接就可以是()。

函数体:->后面的部分,即被{}包围的部分;可以是一段代码。

输出:函数式编程可以没有返回值,也可以有返回值。如果有返回值时,需要代码段的最后一句通过return的方式返回对应的值。

当函数体中只有一个语句时,可以去掉{}进一步简化:

Consumer c = (o) -> System.out.println(o);

常用的几个函数式接口:

nametypedescription
ConsumerConsumer<T>接受T对象,不返回值
PredicatePredicate<T>接受T对象,并返回boolean
FunctionFunction<T,R>接受T对象,返回R对象

Function常用方法&&实践

Function也是一个函数式编程接口;它代表的含义是“函数”,而函数经常是有输入输出的,因此它含有一个apply方法,包含一个输入与一个输出;

除apply方法外,它还有 compose 与 andThen 及 indentity 三个方法,其使用见下述示例;

//将Function对象应用到输入的参数上,然后返回计算结果。
R apply(T t);// 先执行调用者的apply,再执行这个after的apply
// andThen 的语义正是“一步接一步”操作,我执行完,再继续执行你
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (T t) -> after.apply(apply(t));
}// 先执行这个before的apply,再执行调用者的apply
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {Objects.requireNonNull(before);return (V v) -> apply(before.apply(v));
}
public static void functionTest() {Function<Integer, Integer> f = s -> s++;Function<Integer, Integer> g = s -> s * 2;/*** 下面表示在执行F时,先执行G,并且执行F时使用G的输出当作输入。* 相当于以下代码:* Integer a = g.apply(1);* System.out.println(f.apply(a));*/System.out.println(f.compose(g).apply(1));/*** 表示执行F的Apply后使用其返回的值当作输入再执行G的Apply;* 相当于以下代码* Integer a = f.apply(1);* System.out.println(g.apply(a));*/System.out.println(f.andThen(g).apply(1));/*** identity方法会返回一个不进行任何处理的Function,即输出与输入值相等; */System.out.println(Function.identity().apply("a"));
}

说明:

compose 和 andThen 的不同之处是函数执行的顺序不同。

    compose 函数先执行参数,然后执行调用者,

    而 andThen 先执行调用者,然后再执行参数。

其实就是:

andThen:先执行自己的apply方法,再执行别人的apply;

compose:先执行别人的,再执行自己的apply方法;

Consumer常用方法&&实践

顾名思义,Consumer的意思就是消费,即针对某个东西我们来使用它,因此它包含有一个有输入而无输出的accept接口方法; 除accept方法,它还包含有andThen这个方法:

( 这个方法就是指定在调用当前Consumer后是否还要调用其它的Consumer )

/**
* 对给定参数执行消费操作。
* @param t 输入参数
*/
void accept(T t);// void accept(T t) ,意为消费一个指定泛型的数据// consumer 也有 andThen方法,跟Function中作用一样,先执行调用者的accept,再执行这个after的accept
default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };
}举例:
public static void consumerTest() {Consumer f = System.out::println;Consumer f2 = n -> System.out.println(n + "-F2");//执行完F后再执行F2的Accept方法f.andThen(f2).accept("test");//连续执行F的Accept方法f.andThen(f).andThen(f).andThen(f).accept("test1");
}

Predicate常用方法&&实践

Predicate为函数式接口,predicate的中文意思是“断定”,即判断的意思,判断某个东西是否满足某种条件

因此它包含test方法,根据输入值来做逻辑判断,其结果为True或者False。

它的使用方法示例如下:

/*** Predicate测试*/
private static void predicateTest() {Predicate<String> p = o -> o.equals("test");Predicate<String> g = o -> o.startsWith("t");/*** negate: 用于对原来的Predicate做取反处理;* 如当调用p.test("test")为True时,调用p.negate().test("test")就会是False;*/Assert.assertFalse(p.negate().test("test"));/*** and: 针对同一输入值,多个Predicate均返回True时返回True,否则返回False;*/Assert.assertTrue(p.and(g).test("test"));/*** or: 针对同一输入值,多个Predicate只要有一个返回True则返回True,否则返回False*/Assert.assertTrue(p.or(g).test("ta"));
}

这篇关于Java8-Function-Consumer-Predicate的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003633

相关文章

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Spring-AOP-ProceedingJoinPoint的使用详解

《Spring-AOP-ProceedingJoinPoint的使用详解》:本文主要介绍Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的参考价值,希望对大家有所帮... 目录ProceedingJoinPoijsnt简介获取环绕通知方法的相关信息1.proceed()2.g

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Spring MVC跨域问题及解决

《SpringMVC跨域问题及解决》:本文主要介绍SpringMVC跨域问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录跨域问题不同的域同源策略解决方法1.CORS2.jsONP3.局部解决方案4.全局解决方法总结跨域问题不同的域协议、域名、端口

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

SpringBoot操作MaxComputer方式(保姆级教程)

《SpringBoot操作MaxComputer方式(保姆级教程)》:本文主要介绍SpringBoot操作MaxComputer方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录引言uqNqjoe一、引入依赖二、配置文件 application.properties(信息用自己

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

JAVA虚拟机中 -D, -X, -XX ,-server参数使用

《JAVA虚拟机中-D,-X,-XX,-server参数使用》本文主要介绍了JAVA虚拟机中-D,-X,-XX,-server参数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录一、-D参数二、-X参数三、-XX参数总结:在Java开发过程中,对Java虚拟机(JVM)的启动参数进