我可以在Java中使用#define fori(i,n) for(int i=0;i<=n;i++)吗?
当然,java没有预编译器,所以我们不能在Java中这样做。所以我想我们可以使用fori方法,或者使用stream()或者手动定义一个方法。但是我想,不只是遍历,为什么我不能把第三个参数作为lambda表达式来操作。
interface func
{
int calculate(int a,int b);
} int run(int[] array,int start,int end,func t)
{
int result =0;
for(int i=start;i<=end;i++)
{
System.out.println(result);
result = t.calculate(array[i], result);
}
return result;
}public static void main(String[] args)
{
int[] array = {1,2,3,4,5,3,5,3,2,2,3,2,23,2};
System.out.println(run(array, 0, 5, (a,b) -> a + b ));
}我想回顾一下这个代码模式。我主要关心的是,我可以在这里使用多少复杂的lambda表达式。此外,这一模式的未来范围是什么?
发布于 2019-09-18 12:23:11
您实现的模式基本上是一个reduction或foldLeft方法。
与Java中的Stream#reduce方法相比,它非常相似。
要回答您关于lambda在方法中的复杂性的问题:这是没有限制的。你可以在里面做任何你喜欢做的事。lambda表达式只不过是您创建的单方法接口的实现。实现接口的类的复杂性是没有限制的。
下面是一些真正的代码回顾:
。
您的接口简单地命名为func。这可能意味着“函数”,但您不必保存字符,Java已经相当冗长了。
您所拥有的是一种特殊的BiFunction,或者更准确地说,是BinaryOperator。现在我知道泛型不允许为泛型参数指定基本类型,但是您的func接口是不必要的,可以用BinaryOperator替换。
您的run方法有一个非常通用的名称。当然,有一些代码正在运行,但它并没有解释这个方法是干什么的。
调用您的方法reduce或foldLeft或类似的东西会更精确,这在名称中解释了该方法的作用。
当前,您的方法计算一个结果,除此之外,还为每次迭代打印result的值。如果您或使用您的方法的人不希望将每个中间结果打印给他们,怎么办?
如果要打印中间值,请在lambda中这样做。
您的方法目前只适用于基本整数数组。没有什么能阻止您让它处理泛型类型或甚至列表。
如果你走得那么远,你可能还是会使用流的。
https://codereview.stackexchange.com/questions/229236
复制相似问题