双功能的组成

2022-09-04 08:42:58

我有一个 BiFunctions 流,我想将其简化为单个 BiFunction。

更具体地说,我有一个双函数流

BiFunction<x,y,y>

其中 x 和 y 表示参数的类型。

假设我有两个函数

f (x, y) -> y
g (x, y) -> y

我想将它们组合到函数中

h(x, y) -> f(x, g(x, y))

使用Java 8流是否可以做到这一点,如果没有,除了循环所有可用函数并以另一种方式组合它们之外,最优雅的方法是什么?


答案 1

使用 和 ,可以将 和 定义为:x=Integery=Stringfg

BiFunction<Integer, String, String> f = (i, s) -> i + "-f-" + s;
BiFunction<Integer, String, String> g = (i, s) -> i + "-g-" + s;

该函数可以使用简化来构建:h

BiFunction<Integer, String, String> h = Stream.of(f, g)
        .reduce((f_, g_) -> (i, s) -> f_.apply(i, g_.apply(i, s)))
        .get(); //we know the stream is not empty so we can call get directly

如果应用于 和 ,它将返回 。h1"s"1-f-1-g-s


答案 2

作为assylias对答案的轻微修改:根据应用程序模式,您还可以使用Stream#reduce方法,该方法接受一个恒等式作为第一个参数,在这种情况下是“恒等式”(实际上是对第二个参数的投影)。BiFunction

import java.util.function.BiFunction;
import java.util.stream.Stream;

public class BiFunctionsComposition
{
    public static void main(String[] args)
    {
        BiFunction<String, String, String> f = (x,y) -> "f("+x+","+y+")";
        BiFunction<String, String, String> g = (x,y) -> "g("+x+","+y+")";

        BiFunction<String, String, String> h = Stream.of(f, g)
            .reduce((x,y) -> y, (ff,gg) -> (x,y) -> ff.apply(x, gg.apply(x, y)));

        String result = h.apply("A", "B");
        System.out.println(result); // Prints f(A,g(A,B))
    }
}

推荐