我有一个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=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;
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)
如果你申请h到1和"s",它将返回1-f-1-g-s.
作为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)
| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |