JAVA8之函数式编程Function接口用法

网友投稿 281 2023-02-14

JAVA8之函数式编程Function接口用法

从这章开始,会介绍几个常用的函数式接口工具,首先先来看下这个大家族:

首先从Function接口开始介绍

一. 概述

该接口顾名思义,函数的意思,就像是数学,是给定一个参数然后返回结果.该类方法如下:

package java.util.function;

import java.util.Objects;

@FunctionalInterface

public interface Function {

R apply(T t);

default Function compose(Function super V, ? extends T> before) {

Objects.requireNonNull(before);

return (V v) -> apply(before.apply(v));

}

default Function andThen(Function super R, ? extends V> after) {

Objects.requireNonNull(after);

return (T t) -> after.apply(apply(t));

}

static Function identity() {

return t -> t;

}

1. apply方法

该接口的唯一个抽象类是apply方法,接受一个类型的参数,有返回值.功能是将参数赋予相应的方法.

2. compose方法

默认方法,先用入参去调用apply方法,然后再用调用者去调用apply方法.调用的Object.requireNonNull是java7的新特性,如果before是null值的话直接抛出异常.

3. andThen方法

默认方法,与compose方法相反,先用调用者去调用apply方法,然后再用入参去调用apply方法.

4. identity方法

静态方法,java8新特性,返回当前正在执行的方法.

二. 示例

不难看出,除了第一个方法以外,其他三个方法的返回值都是Function,所以后面三个方法是可以链式调用(即用"."方法)的,就如建造者模式(Build)一样.理论讲完,上代码:

package com.yczuoxin.demo;

import java.util.function.Function;

public class FunctionTest {

public static void main(String[] args) {

// 先声明方法

Function funcDouble = (n) -> n * 2;

Function funcPlus2 = (n) -> n + 2;

System.out.println(funcDouble.apply(3));

System.out.println(funcPlus2.apply(3));

System.out.println(funcDouble.andThen(funcPlus2).apply(3));

System.out.println(funcDouble.compose(funcPlus2).apply(3));

System.out.println(Function.identity().compose(funcDouble).apply(8));

}

}

运行结果:

把计算过程也写在上面应该就能知道执行顺序了吧.

三. 总结

这个工具类感觉就是回到了学数学的场QwBre景,自己规定函数,然后调用函数,其实不仅仅可以调用一次andThen方法,后面还以加,只是没有写出来而已,大家可以自己去尝试一下.

补充知识:JAVA8之函数式编程Predicate接口

一.概述

先上这个接口的源码:

package java.util.function;

import java.util.Objects;

@FunctionalInterface

public interface Predicate {

boolean test(T t);

default Predicate and(Predicate super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) && other.test(t);

}

default Predicate negate() {

return (t) -> !test(t);

}

default Predicate or(Predicate super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) || other.test(t);

}

static Predicate isEqual(Object targetRef) {

return (null == targetRef)

? Objects::isNull

: object -> targetRef.equals(object);

}

}

1.test方法

该方法是接受一个传入类型,返回一个布尔值.此方法应用于判断.

2.and方法,or方法

该些方法接收的是一个Predicate类型参数,返回的也是一个Predicate类型.and方法用于两个判断是否都成立,与关系型运算符"&&"相似.而or方法则用于两个判断是否有一个成立.与关系型运算符"||"相似.

3.negate方法

该方法没有传入参数,返回一个Predicate类型.此方法用于对判断进行取反.与关系型云算法"!"相似.

4.isEqual方法

该方法接收一个Object对象,返回一个Predicate类型.此方法用于判断第一个test的方法与第二个test方法相同(equal).

二. 示例

写一个判断字符串的一个判断工具类,包含Predicate4种方法,并返回判断结果.

package com.yczuoxin.demo.predicate;

import java.util.function.Predicate;

public class PredicateUtil {

public static boolean judgeString(String str, Predicate p){

if(null == str){

return false;

}

return p.test(str);

}

public static boolean judgeNoString(String str, Predicate p){

if(null == str){

return false;

}

return p.negate().test(str);

}

public static boolean judgeAndDoubleString(String str, Predicate p1, Predicate p2){

if(null == str){

return false;

}

return p1.and(p2).test(str);

}

public static boolean judgeOrDoubleString(String str, Predicate p1, Predicate p2){

if(null == str){

return false;

}

return p1.or(p2).test(str);

}

}

测试字符串长度是否大于4的方法用例:

package com.yczuoxin.demo.predicate;

import java.util.function.Predicate;

public class PredicateTest {

public static void main(String[] args) {

String testString = QwBre"abcde";

// 判断字符串长度是否大于4

System.out.println(PredicateUtil.judgeString(testString,p->p.length()>4));

// 判断字符串长度是否大于4再取反

System.out.println(PredicateUtil.judgeNoString(testString,p->p.length()>4));

// 判断字符串长度是否大于4并且小于8

System.out.println(PredicateUtil.judgeAndDoubleString(testString,p->p.length()>4,p->p.length()<8));

// 判断字符串长度是否小于4并且大于8

System.out.println(PredicateUtil.judgeOrDoubleString(testString,p->p.length()<4,p->p.length()>8));

// 判断当前方法是否是"test"方法.

System.out.println(Predicate.isEqual("test").test("test"));

System.out.println(Predicate.isEqual("test").test("test1"));

}

}

测试结果:

三. 总结

Predicate适合在工具类和条件筛选的条件下使用,减少if...else的使用,并且使用灵活.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中ThreadLocal的一些理解
下一篇:使用IDEA配置Tomcat和连接MySQL数据库(JDBC)详细步骤
相关文章

 发表评论

暂时没有评论,来抢沙发吧~