Java 带有lambda表达式的ActionListener实现不需要';计时器调用的t工作

Java 带有lambda表达式的ActionListener实现不需要';计时器调用的t工作,java,lambda,Java,Lambda,我正在阅读第10版的书[Core Java Vol 1],在第6章第6.3.6节中,有一段代码片段用于解释lambda表达式中的“变量范围”。我自己运行了这段代码,它只是立即终止,没有像控制台日志中预期的那样每2秒显示一次“Hello” 我正在使用jdk1.8.0_202,下面是我的代码: package variableScope; import java.awt.Toolkit; import java.awt.event.ActionListener; import javax.swi

我正在阅读第10版的书[Core Java Vol 1],在第6章第6.3.6节中,有一段代码片段用于解释lambda表达式中的“变量范围”。我自己运行了这段代码,它只是立即终止,没有像控制台日志中预期的那样每2秒显示一次“Hello”

我正在使用jdk1.8.0_202,下面是我的代码:

package variableScope;

import java.awt.Toolkit;
import java.awt.event.ActionListener;

import javax.swing.Timer;

public class VariableScopeTest {
    public static void main(String[] args) {
        repeatMessage("Hello", 2000);
    }

    private static void repeatMessage(String text, int delay) {
        ActionListener listener = event -> {
            System.out.println(text);
            Toolkit.getDefaultToolkit().beep();
        };
        new Timer(delay, listener).start();
    }
}

有什么解释为什么这不起作用吗?谢谢

这与lambda完全无关,而与没有Swing事件线程有关。您需要显示一个Swing GUI,事件线程才能运行;像JOptionPane这样简单的东西就行了。光靠计时器是不行的

e、 g

import java.awt.Toolkit;
import java.awt.event.ActionListener;    
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Foo {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            repeatMessage("Hello", 2000);
            JOptionPane.showMessageDialog(null, "foo"); // starts the thread
        });

    }

    private static void repeatMessage(String text, int delay) {
        ActionListener listener = event -> {
            System.out.println(text);
            Toolkit.getDefaultToolkit().beep();
        };
        new Timer(delay, listener).start();
    }
}

这与lambda完全无关,而与没有Swing事件线程有关。您需要显示一个Swing GUI,事件线程才能运行;像JOptionPane这样简单的东西就行了。光靠计时器是不行的

e、 g

import java.awt.Toolkit;
import java.awt.event.ActionListener;    
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Foo {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            repeatMessage("Hello", 2000);
            JOptionPane.showMessageDialog(null, "foo"); // starts the thread
        });

    }

    private static void repeatMessage(String text, int delay) {
        ActionListener listener = event -> {
            System.out.println(text);
            Toolkit.getDefaultToolkit().beep();
        };
        new Timer(delay, listener).start();
    }
}

如果你认为lambdas是问题所在,你有没有试着删除它们,然后看看你的代码是如何工作的?@Torben是的,我只是想在我的帖子之后再做。我想我只是要求在这里太快了。下次我会更加注意的。我是这个社区的新手。我应该删除这篇文章吗?如果你认为lambdas是问题所在,你有没有尝试删除它们,然后看看你的代码是如何工作的?@Torben是的,我只是想在我的文章之后再做。我想我只是要求在这里太快了。下次我会更加注意的。我是这个社区的新手。我应该删除这篇文章吗?@NiYilun很高兴这样做了,但其他评论有一个不错的观点——如果你认为是lamba,为什么不在没有lambda的情况下尝试呢?你马上就会发现你的假设是错误的。你需要更多地使用你的代码,尤其是在来这里之前。是的,我只是想在我的帖子之后再做。我想我只是要求在这里太快了。下次我会更加注意的。我是这个社区的新手。我应该删除这篇文章吗?@NiYilun很高兴这样做了,但其他评论有一个不错的观点——如果你认为是lamba,为什么不在没有lambda的情况下尝试呢?你马上就会发现你的假设是错误的。你需要更多地使用你的代码,尤其是在来这里之前。是的,我只是想在我的帖子之后再做。我想我只是要求在这里太快了。下次我会更加注意的。我是这个社区的新手。我应该删除这个帖子吗?