Java 8 Java 8 Lambda表达式从动作事件匿名内部类调用特定方法

Java 8 Java 8 Lambda表达式从动作事件匿名内部类调用特定方法,java-8,Java 8,我在JPanel上有一个文本字段,在这个文本字段上有一个文档侦听器。 由于文档侦听器包含三个methodremoveUpdate、insertUpdate和changeUpdate,所以如何使用Lambda表达式调用特定的方法 field.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdate(DocumentEvent a

我在JPanel上有一个文本字段,在这个文本字段上有一个文档侦听器。 由于文档侦听器包含三个methodremoveUpdate、insertUpdate和changeUpdate,所以如何使用Lambda表达式调用特定的方法

    field.getDocument().addDocumentListener(new DocumentListener() {

        @Override
        public void removeUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub
            button.setText(field.getText());
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {


        }

    });
如何使用类似field.getDocument.addDocumentListenerlambda表达式的Lambda表达式调用此文档侦听器insertUpdate方法

TL;医生:你不能。DocumentListener不是一个 为了使lambda充当特定接口的实例,该接口必须具有单个抽象方法

DocumentListener有3个抽象方法,因此您需要创建一个扩展DocumentListener的SMI:

现在,您可以使用lambda表达式创建InsertListener的实例:

final InsertListener is = e -> button.setText(field.getText());
您可以将其传递到一个方法中:

field.getDocument().addDocumentListener(is);
例如,您还可以创建一个如下所示的接口:

interface InsertListener extends DocumentListener {

    void onEvent(DocumentEvent.EventType type, DocumentEvent e);

    @Override
    default void insertUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }

    @Override
    default void removeUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }

    @Override
    default void changedUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }
}
现在您可以按类型处理任何事件:

final InsertListener is = (t, e) -> {
    if (t == DocumentEvent.EventType.INSERT) {
        button.setText(field.getText());
    }
};
这比匿名类稍微紧凑一些,但不多。

TL;医生:你不能。DocumentListener不是一个 为了使lambda充当特定接口的实例,该接口必须具有单个抽象方法

DocumentListener有3个抽象方法,因此您需要创建一个扩展DocumentListener的SMI:

现在,您可以使用lambda表达式创建InsertListener的实例:

final InsertListener is = e -> button.setText(field.getText());
您可以将其传递到一个方法中:

field.getDocument().addDocumentListener(is);
例如,您还可以创建一个如下所示的接口:

interface InsertListener extends DocumentListener {

    void onEvent(DocumentEvent.EventType type, DocumentEvent e);

    @Override
    default void insertUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }

    @Override
    default void removeUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }

    @Override
    default void changedUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }
}
现在您可以按类型处理任何事件:

final InsertListener is = (t, e) -> {
    if (t == DocumentEvent.EventType.INSERT) {
        button.setText(field.getText());
    }
};
这比匿名类稍微紧凑一些,但不多