当前位置: 首页 > 知识库问答 >
问题:

Netbeans中的Lambda表达式问题

慕容超
2023-03-14

我在Netbeans 8.0中的Lambda表达式有问题,我想知道是我做错了什么,还是Netbeans或javac编译器做错了。

我有以下代码:

public interface HandView extends View<Hand> {
    void onCardAdded(final Card card);

    void onCardPlayed(final int cardIndex);

    void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo);

    public static HandView merge(final HandView... handViews) {
        return new HandView() {
            @Override
            public void onCardAdded(final Card card) {
                Arrays.stream(handViews).forEach(handView -> handView.onCardAdded(card));
            }

            @Override
            public void onCardPlayed(final int cardIndex) {
                Arrays.stream(handViews).forEach(handView -> handView.onCardPlayed(cardIndex));
            }

            @Override
            public void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo) {
                Arrays.stream(handViews).forEach(handView -> handView.onCardsSwapped(cardIndexOne, cardIndexTwo));
            }
        };
    }

    @FunctionalInterface
    public static interface OnCardAddedListener extends HandView, Consumer<Card> {
        @Override
        default void accept(final Card card) {
            onCardAdded(card);
        }

        @Override
        void onCardAdded(final Card card);

        @Override
        default void onCardPlayed(final int cardIndex) { }

        @Override
        default void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo) { }
    }

    @FunctionalInterface
    public static interface OnCardPlayedListener extends HandView, IntConsumer {
        @Override
        default void accept(final int cardIndex) {
            onCardPlayed(cardIndex);
        }

        @Override
        default void onCardAdded(final Card card) { }

        @Override
        void onCardPlayed(final int cardIndex);

        @Override
        default void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo) { }
    }

    @FunctionalInterface
    public static interface OnCardsSwappedListener extends HandView {
        @Override
        default void onCardAdded(final Card card) { }

        @Override
        default void onCardPlayed(final int cardIndex) { }

        @Override
        void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo);
    }
}

然后我将其与:

AtomicInteger counter = new AtomicInteger(0);
HandView handView = card -> counter.incrementAndGet();

Netbeans给出以下消息:

incompatible types: HandView is not a functional interface
    multiple non-abstract methods found in interface HandView

那我就决定手动投了:

HandView handView = 
    (HandView.OnCardAddedListener)card -> counter.incrementAndGet();

现在它警告我,演员阵容是多余的。

当我在Netbeans 8.0中用原始版本编译它时,它编译得很好,没有任何编译(或运行时)错误。现在到底是谁的错?

我会说那张卡——


共有2个答案

谭京
2023-03-14
匿名用户

您应该尽可能多地使用@FunctionalInterface

如果您注释了HandView界面

@FunctionalInterface
public interface HandView extends View<Hand> {

你会得到一个编译错误,即HandView界面不起作用,即。它声明了多个抽象方法。

当你铸造它时

HandView handView = 
(HandView.OnCardAddedListener)card -> counter.incrementAndGet();

它应该起作用。该上下文中的lambda表达式,即<code>HandView。应为OnCardAddedListener,将看到OnCardAdded Listener,它是一个@FunctionalInterface。因此,可以从lambda表达式创建实例。

完整性的其他信息:考虑一个函数接口可以有任意数量的默认或静态方法,例如参见java.util.function.函数。

况经纬
2023-03-14

我认为您从Netbean获得的错误消息是正确的:

public interface HandView extends View<Hand> {
    void onCardAdded(final Card card);

    void onCardPlayed(final int cardIndex);

    void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo);

    (...)
}

这确实不是FunctionalInterface。

关于这一行:

HandView handView = 
    (HandView.OnCardAddedListener)card -> counter.incrementAndGet();

我会这样写:

HandView.OnCardAddedListener handView = card -> counter.incrementAndGet();

我希望编译器能够更好地处理,没有任何警告。

 类似资料:
  • (译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) Lambda表达式是一种描述函数对象的机制,它的主要应用是描述某些具有简单行为的函数(译注:Lambda表达式也可以称为匿名函数,具有复杂行为的函数可以采用命名函数对象,当然,何谓复杂

  • Lambda表达式在Java 8中引入,并被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了很多开发。 语法 (Syntax) lambda表达式的特征在于以下语法。 parameter -> expression body 以下是lambda表达式的重要特征。 Optional type declaration - 无需声明参数类型。 编译器可以从参数的值推断出相同的

  • 我正在使用NetBeans 8。当我的代码包含Lambda表达式并尝试编译时,我会收到以下错误消息:

  • 问题内容: Java8中添加了Lambda表达式。我想理解为什么这很重要。对于尚未接触函数式编程习惯的Java程序员意味着什么?这是否意味着我可以编写出性能更好的代码或可大规模扩展的代码,还是只会使代码的详细程度降低。或全部。 问题答案: Oracle已经提供了有关该主题的教程。它列出了几个很好的用例。 在找到链接之前,我要说的是lambda表达式可让您将“函数”传递给代码。因此,您可以更轻松地编

  • 主要内容:函数式接口Lambda 表达式(Lambda expression)是一个匿名函数,基于数学中的λ演算得名,也可称为 闭包(Closure)。现在很多语言都支持 Lambda 表达式,如 C++、 C#、 Java、 Python 和 JavaScript 等。 Lambda 表达式是推动 Java 8 发布的重要新特性,它允许把函数作为一个方法的参数(函数作为参数传递进方法中),下面通过例 1 来理解 L

  • 1 Java8 Lambda表达式的介绍 Lambda表达式是Java8中包含的一项新的重要功能。它提供了一种简洁明了的方式来使用表达式表示一个方法接口。在Collection集合中非常有用。它有助于集合元素的迭代,过滤和从集合中提取数据。 Lambda表达式用于提供具有功能接口的接口的实现。它节省了大量代码。在使用Lambda表达式的情况下,我们无需再次定义用于提供实现的方法。我们只编写实现代码