Java 双函数的合成

Java 双函数的合成,java,java-8,Java,Java 8,我有一个双函数流,我想把它简化成一个单双函数 更具体地说,我有一个双函数流 BiFunction<x,y,y> 我想把它们组合成函数 h(x, y) -> f(x, g(x, y)) 使用Java 8流是否可能实现这一点?如果不可能,除了循环所有可用函数并以另一种方式组合它们之外,最优雅的方式是什么?使用x=Integer和y=String,您可以将f和g定义为: BiFunction<Integer, String, String> f = (i, s) -&

我有一个双函数流,我想把它简化成一个单双函数

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

BiFunction<x,y,y>
我想把它们组合成函数

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

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

使用
x=Integer
y=String
,您可以将
f
g
定义为:

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

如果将
h
应用于
1
“s”
,它将返回
1-f-1-g-s
,作为对的轻微修改:根据应用程序模式,您还可以使用接受标识作为第一个参数的方法,在本例中是“标识
双功能”(实际上,是第二个参数的投影)

import java.util.function.BiFunction;
导入java.util.stream.stream;
公共类双函数组合
{
公共静态void main(字符串[]args)
{
双函数f=(x,y)->“f”(“+x+”,“+y+”)”;
双函数g=(x,y)->“g”(“+x+”,“+y+”)”;
双函数h=流(f,g)
.reduce((x,y)->y,(ff,gg)->(x,y)->ff.apply(x,gg.apply(x,y));
字符串结果=h.apply(“A”、“B”);
System.out.println(结果);//打印f(A,g(A,B))
}
}

您正在寻找Stream.reduce,您需要给它一个lambda,它接受f和g并返回h。除了我们可以放弃get()调用之外,与接受的答案相比还有什么优势吗?这取决于:如果您想提供像
BiFunction compose(Stream-Stream)这样的函数
,则您可能不知道流是否为空。因此,您必须先检查
可选项
以查看它是否为空。我认为在这种情况下使用“identity”函数是合理和方便的。请注意
stream.of(f,g).reduce((f,g)->…
是多余的,但在这种情况下,它允许您概括为两个以上的输入函数。是的,这是一个想法-只有两个函数,就不需要流。
BiFunction<Integer, String, String> f = (i, s) -> i + "-f-" + s;
BiFunction<Integer, String, String> g = (i, s) -> i + "-g-" + s;
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
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))
    }
}