当前位置: 首页 > 知识库问答 >
问题:

Lambdas和Runnable

司徒钱青
2023-03-14

我的理解是lambda的表达式被用来替换抽象实现的boiler-plater代码。因此,如果我必须创建一个接受可运行接口(函数式)的新线程,我不必创建一个新的匿名类,然后提供void run()并在其中编写逻辑,而是可以简单地使用lambda并将其指向一个方法,前提是方法签名与run相同,即不接受任何内容,也不返回任何内容。

但是我不能理解下面的实现

Thread t= new Thread(()->printStudent(stud));

public static void printStudent(Student stud) {
        System.out.println("Student is "+ stud);
    }

在上面的例子中,printStudent使用了一个参数(不像runnable的run()方法),尽管它可以正常工作。

这是怎么工作的?

共有1个答案

狄宇
2023-03-14

您不是将参数传递给run()方法,而是表示run()方法的()->部分。您所做的只是将方法定义为:

 @Override
 public void run(){
      printStudent(stud); //the value of stud from the context copied here
 }
 类似资料:
  • lambdas和streams的概念有点弱,所以可能有些东西真的没有任何意义,但我会尝试表达我想要发生的事情。 我有一个类发票,其中有一个项目名称,价格,和数量。我必须映射项目名称和总成本(价格*数量)。 这将在多个发票对象上完成。 此外,我需要排序他们的总数,也过滤那些超过一定的数量,例如。100.把它们放进地图后我该怎么做?

  • Lambda表达式是一种很简单的方法,去定义一个匿名函数。Lambda是非常有用的,因为它们避免我们去写一些包含了某些函数的抽象类或者接口,然后在类中去实现它们。在Kotlin,我们把一个函数作为另一个函数的参数。

  • 是否可以对流进行求和、平均并将其转换为新对象。我有个目标 现在我想得到这个对象列表的平均值和总和(代码总和价格和代码平均价格) 然后我想创建一个新对象(页脚 这就是我现在所拥有的,它可以工作,但是我要通过两次流。我想要一个方法,我可以通过一次流来做到这一点。 有没有更好的方法做到这一点而不必重复这一点。谢谢

  • 我们用Android中非常典型的例子去解释它是怎么工作的:View.setOnClickListener()方法。如果我们想用Java的方式去增加点击事件的回调,我首先要编写一个OnClickListener接口: public interface OnClickListener { void onClick(View v); } 然后我们要编写一个匿名内部类去实现这个接口: view.s

  • 我不明白为什么以下代码无法编译: 编译错误: orElse(org.springframework.http.ResponseEntity 虽然这段代码(我认为逻辑上是相同的代码)确实可以编译: 问题似乎是RequestErrorHandler 如果我将validationErrors强制转换为映射lambda中的JSendResponse,那么我可以编译它,但随后会丢失JSendFailResp

  • 1)做这件事的正确方法是什么?我做错了什么? 2)流是线程安全的吗?我正在多线程环境中工作,所以我是否应该使用返回TRAAD安全集合的收集器?