BiFunctions的组成

lup*_*p3x 13 java java-8

我有一个BiFunction流,我想减少到一个BiFunction.

更具体地说,我有一系列BiFunctions

BiFunction<x,y,y>
Run Code Online (Sandbox Code Playgroud)

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

假设我有两个功能

f (x, y) -> y
g (x, y) -> y
Run Code Online (Sandbox Code Playgroud)

我想把它们组合成函数

h(x, y) -> f(x, g(x, y))
Run Code Online (Sandbox Code Playgroud)

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

ass*_*ias 13

使用x=Integery=String,你可以定义fg:

BiFunction<Integer, String, String> f = (i, s) -> i + "-f-" + s;
BiFunction<Integer, String, String> g = (i, s) -> i + "-g-" + s;
Run Code Online (Sandbox Code Playgroud)

并且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
Run Code Online (Sandbox Code Playgroud)

如果你申请h1"s",它将返回1-f-1-g-s.

  • 是的,这就是想法 - 只需要两个功能就不需要流. (3认同)
  • 注意`Stream.of(f,g).reduce((f_,g_) - > ...`是冗余的,但在这种情况下,它允许你推广到两个以上的输入函数. (2认同)

Mar*_*o13 8

作为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))
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这取决于:如果你想提供像'BiFunction <X,Y,Z> compose(Stream <BiFunction <X,Y,Z >> stream)`那样的函数,那么你*可能*不知道流是空的还是不.所以你必须首先检查`Optional`以查看它是否为空.我认为在这种情况下使用"身份"功能是合理和方便的. (3认同)