如何使用Lambda调用特定的父构造函数?

时间:2017-11-21 11:28:47

标签: java lambda

我知道使用lambda表达式调用单个arg构造函数的过程。但不确定如何使用其他参数(不是单个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() {                
        }

    };

感谢您的任何帮助。谢谢。

3 个答案:

答案 0 :(得分:2)

我不确定我是否理解这个问题,但是如果你想使用lambda和string构造函数这样的话应该有效:

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

因为Thread类中的构造函数如下所示:

 public Thread(Runnable target, String name)

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

答案 1 :(得分:1)

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

}, "ThreadName");

答案 2 :(得分:1)

你的第二个例子不仅仅是调用构造函数。它定义了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. 通过使用重写方法定义子类
  3. 如果类型是功能接口,则lambda可以用作匿名子类(class)或实现(interface),例如{ {1}}:

    Callable

    但是Callable<Foo> r = () -> doSomething(); 不是一个功能界面 - 它没有一个抽象方法 - 所以你不能为Thread执行此操作。

    对于您所拥有的特定情况,Thread有两个参数构造函数,因此您不需要创建子类。

    Thread