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

相关文章

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Java Lambda表达式的使用详解

《JavaLambda表达式的使用详解》:本文主要介绍JavaLambda表达式的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言二、Lambda表达式概述1. 什么是Lambda表达式?三、Lambda表达式的语法规则1. 无参数的Lambda表

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请