java为一个非常基本的类编写lambda表达式
有两个功能接口
public interface BoolBiFunction {
boolean apply( int p1, int p2 );
}
public interface IntFunction {
int apply(int p);
}
接下来的课呢
public class IntData {
private int[] intValues;
public IntData(int[] p) {
intValues = p;
}
public int compute(BoolBiFunction f, IntFunction g, int x) {
int result = 0;
for (int value : intValues) {
if (f.apply(value, x)) {
result = result + g.apply(value);
}
}
return result;
}
任务是使用参数,因此compute会告诉一个数字在字段intValues中出现的频率。 但说实话,我真的不明白给定的计算方法到底做了什么
if ( f.apply( value, x ) )
{
result = result + g.apply( value );
}
f似乎比较了这两个整数,但g.apply到底做了什么呢? 用于检查一个数字在字段intValues中出现的频率的lambda表达式会是怎样的呢
# 1 楼答案
由于您没有提供两个给定lambda的具体实现,我想用一个简单的例子来解释:
要调用
compute()
方法,我们需要BoolBiFunction
和IntFunction
的实现然后我们初始化
x
和intValues
调用
compute()
方法输出:
在
for
循环的每个步骤中的值:在这个例子中
g.apply(value)
返回value*2
因为
Intfunction
的实现是p -> p*2
# 2 楼答案
这个问题在我看来有点奇怪。但是,这里有一个解决方案
查看代码注释以了解发生了什么。我提供了一个额外的例子,说明如何使用相同的计算(…)函数来确定给定数字在该数组中出现的次数
计算函数内部发生了什么
f.应用(值,x):
result=result+g.apply(值):
我们可以重用compute()方法来做其他事情,比如除了最初的问题之外,还可以找到给定数字的三元组在数组中出现的次数。有两种方法可以做到这一点——使用上述代码并搜索6,或者使用bi函数检查一个数字是否是另一个数字的三倍。我们在下面的代码中使用后一种方法。如果你愿意,你可以想出一个更好的例子
# 3 楼答案
你的
compute
方法接受一个BoolBiFunction
测试两个int
值是否满足某些条件。如果它们满足条件(即如果f.apply(value, x)
是true
),则对当前值应用IntFunction
的结果被添加到总数中例如,如果想知道
intValues
数组中有多少个元素等于5,必须调用:这意味着当且仅当传递给它的两个
int
相等时,BoolBiFunction
将返回true
IntFunction
将始终返回1
,因此它将计算在intValues
数组中找到第三个参数-5的次数给定传递给
compute()
的上述参数,如果我们用相应lambda表达式的实际体替换对f.apply
和g.apply
的调用,我们将得到: