Java 函数接口BiFunction与BinaryOperator简介与示例【函数式编程】【Stream】

Java 8引入了一种新的函数式编程风格,Function接口是Java函数式编程中最重要的四个函数式接口之一。
函数接口BiFunction,它是Function接口的扩展版本。
BinaryOperator 也是 Java 8 中引入的一个函数式接口,位于 java.util.function 包中。它是一个特殊的 BiFunction,用于表示接受两个相同类型的参数并返回相同类型结果的操作。该接口定义了一个 apply 方法,用于执行操作。

在介绍函数接口BiFunction,我们先要学习Function接口。

Function 函数式接口实现的功能:接受一个输入参数,然后返回一个结果。
Function:接收一个参数并返回一个结果
定义:Function 接收一个类型为 T 的参数,并返回一个类型为 R 的结果。

  • T:输入参数的类型。
  • R:返回值的类型。
  • apply(T t):抽象方法。方法用于接收输入参数并返回结果。

关于Function接口的详细介绍,请参见我的博客:Java 函数接口Function详解与示例【函数接口Function】

函数接口BiFunction
函数接口BiFunction,它是Function接口的扩展版本。BiFunction:接收两个参数并返回一个结果。
定义:BiFunction 接收两个参数,T 和 U,并返回一个类型为 R 的结果。

  • T:第一个输入参数的类型。
  • U:第二个输入参数的类型。
  • R:返回值的类型。
  • apply(T t, U u):抽象方法。方法用于接收两个输入参数并返回结果。
        // 定义一个 BiFunction:接收两个整数并返回它们的乘积
        BiFunction<Integer, Integer, Integer> multiplyFun = (a, b) -> a * b;
        // 调用 apply() 方法传递两个参数并获取结果
        System.out.println(multiplyFun.apply(5, 3));  // 输出 15

        // 两个参数构造器,创建实例
        BiFunction<String, Integer, Person> bFun = (name, age) -> new Person(name, age);
        BiFunction<String, Integer, Person> bFun1 = Person::new;
        System.out.println("优秀员工:"+bFun1.apply("赵有为", 42));

BiFunction函数接口例程

package function;
import java.util.function.BiFunction;
public class BiFunctionTest {
    public static Integer operate(int a, int b, BiFunction<Integer, Integer, Integer> op) {
        return op.apply(a, b);
    }

	public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
        BiFunction<Integer, Integer, Integer> subtract = (a, b) -> a - b;

        int x = 12;
        int y = 6;
        System.out.println("算术运算:加(Add): " + operate(x, y, add));
        System.out.println("算术运算:减(Subtract): " + operate(x, y, subtract));
	}
}

BiFunction + 构造函数的实例
通过方法引用 className::new调用,返回对象。

        BiFunction<String, Integer, Person> biCrtPsnFun = Person::new;
        Person personA = biCrtPsnFun.apply("李明", 32);
        Person personB = biCrtPsnFun.apply("张亮", 12);
        System.out.println("personA =" + personA);
        System.out.println("personB =" + personB);

函数接口BinaryOperator
BinaryOperator 是 Java 8 中引入的一个函数式接口,位于 java.util.function 包中。它是一个特殊的 BiFunction,用于表示接受两个相同类型的参数并返回相同类型结果的操作。
Java 8函数式接口BinaryOperator是 BiFunction 的子接口。它表示接受两个相同类型的输入参数 T 并返回一个结果 T 的操作。该接口定义了一个 apply 方法,用于执行操作。

@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T, T, T> {
    // 此处可以添加其他方法
}

BinaryOperator示例:

	public static void binaryOperator() {
		/***下面是双参数的BinaryOperator,继承自BiFunction***/
		BinaryOperator<Integer>  adder = (x, y) -> x + y;
        int sum = adder.apply(10, 20);
        System.out.println("Sum: " + sum); // 输出 Sum: 30
        
		BinaryOperator<Integer>  accumulator = Integer::sum;
        sum = accumulator.apply(100, 200);
        System.out.println("Sum: " + sum); // 输出 Sum: 300
        
        BinaryOperator<Person> olderPerson = (p1, p2) -> p1.getAge() > p2.getAge() ? p1 : p2;
        
        Person person1 = new Person("张三", 38);
        Person person2 = new Person("李四", 65);
 
        Person older = olderPerson.apply(person1, person2);
        System.out.println("年长的人: " + older); // 输出: 年长的人: 姓名:李四  年龄:65
        
	}

上述示例中用到的自定义对象Person类:

public class Person {
        private String name;
        private int age = 32;
        
        public Person(String name) { // 构造器
        	this.name = name;
        }
     
        // 构造器
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
     
        // getter和setter方法
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public int getAge() {
            return age;
        }
     
        public void setAge(int age) {
            this.age = age;
        }
        
        @Override
        public String toString() {
        	return "姓名:"+name + "  年龄:"+age;
        }
}

BiFunction与BinaryOperator的应用场景

  • 计算操作: 用于执行需要两个输入的计算操作,如数学运算、合并数据等。例如,计算两个数的和、差、积、商。

  • 数据约简: 在函数式编程中,可能需要将两个输入归一为一个结果,例如reduce操作的数据合并时,可使用 BiFunction和BinaryOperator 计算合并结果。

  • 函数链: 使用 andThen 方法将 BiFunction 与其他函数组合在一起,从而实现更复杂的数据处理流程。例如,先进行计算然后进行后续的数据处理。

参考文献
【函数接口与方法引用】Java 中的方法引用

你可能感兴趣的:(函数接口,java)