【问题标题】:How to call a specific parent constructor using Lambda?如何使用 Lambda 调用特定的父构造函数?
【发布时间】:2017-11-21 11:28:47
【问题描述】:

我知道使用 lambda 表达式调用单个 arg 构造函数的过程。但不确定如何使用附加参数(不是单个参数)调用构造函数。这可以通过使用匿名内部类来实现,如 "How to call a specific parent constructor from anonymous inner class?" 中所示。但我对使用 lambda 表达式更感兴趣。

例如:调用 Thread 类中的单 arg 构造函数,我可以这样做

Thread t1 = new Thread (() -> {
    //do sometask

});

但我找不到类似的方法来调用 Thread(String name) 构造函数。

基本上我想用 lambda 做类似下面的事情

Thread t2 = new Thread("Thread2") {
        @Override
        public void run() {                
        }

    };

感谢您的帮助。谢谢。

【问题讨论】:

  • 你的例子不清楚。它没有调用 Thread 的零参数构造函数 - 它调用具有单个 Runnable 参数的构造函数。为什么需要一个 lambda 表达式来调用 Thread(String name) 构造函数? String 不是功能接口。
  • 您的示例正在调用公共线程(可运行目标),其中可运行是功能接口,因此,您可以在构造函数中使用 lambda。
  • @Eran - 很抱歉造成混乱,现在编辑问题
  • 看来你真正想要的是两个参数的构造函数——Thread t1 = new Thread(() -> { doSomeTask(); }, "Thread1")

标签: java lambda


【解决方案1】:

我不确定我是否理解这个问题,但如果你想使用 lambda 和字符串构造函数,这样的东西应该可以工作:

Thread t2 = new Thread(() -> System.out.println("in "), "Thread2")

因为 Thread 类中的构造函数看起来像:

 public Thread(Runnable target, String name)

所以第一个参数可以使用 lambda 表达式(函数式接口),第二个参数是线程的名称。

【讨论】:

    【解决方案2】:
    Thread t1 = new Thread (() -> {
        //do sometask
    
    }, "ThreadName");
    

    【讨论】:

    • 这回答了正文中的问题,但没有回答“如何使用 Lambda 调用特定的父构造函数?”
    • @slim 我认为 OP 想要使用的标题是“如何使用 Lambda 作为参数调用特定的父构造函数?”这更接近实际提出的问题。
    • @tobias_k 我觉得代码是不言自明的,显然 OP 同意。
    【解决方案3】:

    您的第二个示例不仅仅是调用构造函数。它定义了Thread 的匿名子类,并调用了它的构造函数。

    Thread t2 = new Thread("Thread2") {
        @Override
        public void run() {
             // do something                
        }
    
    };
    

    相当于:

    class MyThread extends Thread {
        @Override
        public void run() {
             // do something                
        }
    }
    
    Thread t2 = new MyThread("Thread2");
    

    所以它以两种方式定义关于新对象的“东西”:

    1. 通过将“Thread2”传递给构造函数
    2. 通过定义具有重写方法的子类

    如果类型是函数式接口,则 lambda 可以用作(class 的)匿名子类或(interface 的)实现,例如Callable

    Callable<Foo> r = () -> doSomething();
    

    但是Thread 不是一个函数式接口——它没有确切的一个抽象方法——所以你不能为Thread 这样做。

    对于您的具体情况,Thread 有一个两个参数的构造函数,因此您不需要创建子类。

    Thread t1 = new Thread( () -> someMethod(), "Thread1");
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2010-12-06
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多