我理解BiFunction的合约,其函数方法为apply(T t,U u),它接受两个参数。 但事实是,我不明白使用它的好处。 你能帮帮我吗?
答案 0 :(得分:12)
这个问题的问题在于,您是否看到Function
的目的尚不清楚,apply(T t)
的方法是ui.onClick(new ClickHandler() {
public void handleAction(Action action) {
// do something in response to a click, using `action`.
}
}
。
所有功能类型的值是您可以像数据一样传递代码。一个常见的用途是回调,直到Java 8,我们以前必须使用匿名类声明来执行此操作:
ui.onClick( action -> { /* do something with action */ });
现在有了lambdas,我们可以更加简洁地做到这一点:
Consumer clickHandler = action -> { /* do something with action */ };
ui.onClick(clickHandler);
我们也可以将它们分配给变量:
Map<String,Consumer> handlers = new HashMap<>();
handlers.put("click", handleAction);
...并执行我们对象所做的常规操作,例如将它们放入集合中:
BiFunction
BiFunctions
只有两个输入参数。让我们使用我们迄今为止看到的对Map<String,BiFunction<Integer,Integer,Integer>> operators = new HashMap<>();
operators.put("+", (a,b) -> a + b);
operators.put("-", (a,b) -> a - b);
operators.put("*", (a,b) -> a * b);
...
// get a, b, op from ui
ui.output(operators.get(operator).apply(a,b));
做一些有用的事情:
Appium
答案 1 :(得分:2)
BiFunction
方法中使用Map.merge
的一种用法。
以下是Map.merge
方法的示例用法,该方法使用BiFunction
作为参数。如果值为null或键没有值,merge
的作用基本上是用给定值替换给定键的值。否则,在应用BiFunction
后替换给定密钥的值。
HashMap<String, String> map = new HashMap<>();
map.put("1", null);
map.put("2", "Hello");
map.merge("1", "Hi", String::concat);
map.merge("2", "Hi", String::concat);
System.out.println(map.get("1")); // Hi
System.out.println(map.get("2")); // HelloHi
如果未使用BiFunction
,则必须编写更多代码,甚至跨越多行。
以下链接显示了JDK中BiFunction
的所有用法:https://docs.oracle.com/javase/8/docs/api/java/util/function/class-use/BiFunction.html
去看看吧!
答案 2 :(得分:0)
BiFunction 的一个额外示例是 reduce()
:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(5,5,10));
Integer reduce = list.stream().reduce(0, (v1,v2) -> v1+v2);
System.out.println(reduce); // result is: 20
}