首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Lambdas自动化任务

使用Lambdas自动化任务
EN

Code Review用户
提问于 2019-09-18 11:53:43
回答 1查看 208关注 0票数 6

我可以在Java中使用#define fori(i,n) for(int i=0;i<=n;i++)吗?

当然,java没有预编译器,所以我们不能在Java中这样做。所以我想我们可以使用fori方法,或者使用stream()或者手动定义一个方法。但是我想,不只是遍历,为什么我不能把第三个参数作为lambda表达式来操作。

功能接口:

代码语言:javascript
复制
interface func
{
    int calculate(int a,int b);
}

方法实现:

代码语言:javascript
复制
 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;
  }

使用:

代码语言:javascript
复制
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表达式。此外,这一模式的未来范围是什么?

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-09-18 12:23:11

您实现的模式基本上是一个reductionfoldLeft方法。

与Java中的Stream#reduce方法相比,它非常相似。

要回答您关于lambda在方法中的复杂性的问题:这是没有限制的。你可以在里面做任何你喜欢做的事。lambda表达式只不过是您创建的单方法接口的实现。实现接口的类的复杂性是没有限制的。

下面是一些真正的代码回顾:

使用正确易懂的名称,并使用内置类型

您的接口简单地命名为func。这可能意味着“函数”,但您不必保存字符,Java已经相当冗长了。

您所拥有的是一种特殊的BiFunction,或者更准确地说,是BinaryOperator。现在我知道泛型不允许为泛型参数指定基本类型,但是您的func接口是不必要的,可以用BinaryOperator替换。

您的run方法有一个非常通用的名称。当然,有一些代码正在运行,但它并没有解释这个方法是干什么的。

调用您的方法reducefoldLeft或类似的东西会更精确,这在名称中解释了该方法的作用。

使您的方法做了一件事,

当前,您的方法计算一个结果,除此之外,还为每次迭代打印result的值。如果您或使用您的方法的人不希望将每个中间结果打印给他们,怎么办?

如果要打印中间值,请在lambda中这样做。

你想考虑一下未来的

您的方法目前只适用于基本整数数组。没有什么能阻止您让它处理泛型类型或甚至列表。

如果你走得那么远,你可能还是会使用流的。

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/229236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档