BiFunction

       这里提醒一点,可以看出该接口中有方法的实现,不单单只有抽象方法,在java8中,有一个新的改进就是在现有的接口中增加了一些默认的方法实现,使用default关键字来修饰。这种做法不会影响以前代码对接口的实现,也对原有的接口进行了扩展。
传递行为给方法,而不是传递值。

/**
 * BiFunction是一个函数式接口,它接口两个参数并产生一个结果值返回。
 * 它里面有一个apply(Object,Object)方法。
 * @param <T> 函数的第一个参数类型
 * @param <U> 函数的第二个参数类型
 * @param <R> 函数的结果类型
 * @since 1.8
 */
@FunctionalInterface
public interface BiFunction<T, U, R> {

    /**
     * 将apply函数应用到给定的参数上面
     *
     * @param t 函数的第一个参数
     * @param u 函数的第二个参数
     * @return R 函数的结果
     */
    R apply(T t, U u);

    /**
     * 返回一个组合的函数,第一次是将该函数应用到它的输入,接着是将该函数的after应用到
     * 之前的结果上。如果在任一函数评测期间抛出异常,它都会被传递给组合函数的调用者。
     * @param <V> 组合函数和after函数的输出类型
     * @param after 该函数应用将被在当前函数apply后被apply
     * @return 返回一个组合函数,第一次应用该函数,接着应用after函数
     * @throws 当after为null的时候,会抛出NullPointerException异常。
     */
    default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t, U u) -> after.apply(apply(t, u));
    }
}
import java.util.function.BiFunction;
import java.util.function.Function;

public class BiFunctionTest {
    public static void main(String[] args){
        BiFunctionTest test = new BiFunctionTest();
        //实现四则运算
        System.out.println(test.compute(4,2,(value1,value2)->value1+value2));
        System.out.println(test.compute(4,2,(v1,v2)->v1-v2));
        System.out.println(test.compute(1,2,(v1,v2)->v1*v2));
        System.out.println(test.compute(3,2,(v1,v2)->v1/v2));
        System.out.println(test.calcute(3,4,(v1,v2)->v1+v2,v->v * v));
    }

    public  int compute(int num1, int num2, BiFunction<Integer,Integer,Integer> biFunction){
        return  biFunction.apply(num1,num2);
    }

    public int calcute(int num1, int num2, BiFunction<Integer,Integer,Integer> biFunction, Function<Integer,Integer> function){
        //调用addThen首先对接收的两个参数进行bifunction的apply,然后在进行function的apply
        return biFunction.andThen(function).apply(num1,num2);
    }
}

       输出结果:

6
2
2
1
49

BiConsumer

       BiConsumer<T,U>接口是java8 Function函数里面的接口,它有两个方法, BiConsumer用法很简单。

//接收参数
void accept(T t, U u)
//默认方法,基本没什么用
default BiConsumer<T,U> andThen(BiConsumer<? super T,? super U> after)

       BiConsumer用法示例(java8)示例如下,andThen(biConsumer)方法没有什么效果(可不用),主要是学会使用accept(T t, U u)方法,如下。

import java.util.function.BiConsumer;

public class TestDemo {
    public static void main(String[] args) {
        BiConsumer<String, String> biConsumer = (x, y) -> {
            System.out.println(x+"==="+y);
        };
        biConsumer.andThen(biConsumer).accept("tpyyes.com ", " java8");
    }
}

       输出x与y参数的值,如下。

tpyyes.com === java8
tpyyes.com === java8

https://www.tpyyes.com/a/java/283.html
http://www.manongjc.com/article/50415.html