gpt4 book ai didi

java - 有没有办法将现有界面变成功能界面?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:35 26 4
gpt4 key购买 nike

我使用的界面看起来与此类似:

public interface ObjectListener {
public void objectAdded(Object o);
public void objectRemoved(Object o);
}

而我目前正在使用一个匿名类来实现接口(interface),但我并不关心这两种方法中的一种。类似这样的事情:

someObject.addListener(new ObjectListener() {

@Override
public void objectAdded(Object o) {
doSomething(o);
}

@Override
public void objectRemoved(Object o) {}
});

现在,我一直在尽可能使用 Java 8 中的新 lambda 表达式,并且我想在这种情况下使用增加的简单性。毕竟,我只是实现其中一个方法,但由于接口(interface)中有两个方法,我不能在 lambda 表达式中使用它。

我有办法绕过这个限制吗?

最佳答案

为了在 lambda 表达式中重用不是函数式接口(interface)的现有接口(interface),您还必须使用新的 Java8 功能,即默认方法。

在这种情况下,如果您想使用 lambda 表达式代替匿名类,则必须执行以下操作。

首先,您需要将 ObjectListener 重新定义为一个新接口(interface):

public interface ObjectAddedListener extends ObjectListener {
@Override
default public void objectRemoved(Object o) {}
}

我们只是简单地向我们不关心的方法添加一个空的默认实现,这使得 objectAdded() 方法成为接口(interface)中唯一的抽象方法。

然后您可以使用新类型代替任何 ObjectListener,并且由于在新接口(interface)中只有一个方法没有实现,您可以在 lambda 表达式中使用它,如下所示:

ObjectAddedListener listener = o -> doSomething(o);
someObject.addListener(listener);

请注意,如果您想在 addListener() 方法中直接使用此新类型,您首先需要将 lambda 表达式转换为新定义的类型,如下所示:

someObject.addListener((ObjectAddedListener) o -> doSomething(o));

关于java - 有没有办法将现有界面变成功能界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23284421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com