【问题标题】:Simple tutorial example (lambda expression) doesn't run简单的教程示例(lambda 表达式)不运行
【发布时间】:2015-08-28 19:58:47
【问题描述】:

最后决定对jdk8的新特性开始一点实验,即lambda expressions following the tutorial。为方便起见,我对示例进行了精简,请参见下面的 SSCCE。

键入谓词运行良好,将其重构为 Netbeans 建议(并实际完成)的 lambda 表达式编译(?)没有错误,但不运行。简洁的控制台打印输出是

Fehler: Hauptklasse simple.Simple konnte nicht gefunden oder geladen 韦登

("错误:无法找到或加载主类")

环境:

  • jdk: jdk-8-ea-bin-b102-windows-i586-08_aug_2013.exe
  • Netbeans 7.4 beta,2013 年 7 月 14 日的捆绑包。不确定这是否是最新的,无法从 Netbeans 网站下载(点击下载链接时出现“内容编码错误”)

顺便说一句,考虑使用 Netbeans 只是因为它已经支持 jdk8(如果不是 netbeans,还有谁 ;-) - efxclipse 的 eclipse beta 预览版有类似的问题(编译但不运行示例)。所以绝对是在我的舒适区之外,可能是我的一些非常愚蠢的错误......?

package simple; 

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class Simple {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        List<Member> members = createMembers();
        // implement predicate directly, runs fine
//        Predicate<Member> predicate = new Predicate<Member>() {
//            public boolean test(Member member) {
//                return member.getAge() >= 18;
//            }
//        }; 
        // predicate converted to lambda, fails to run
        // "class couldn't be found"
        Predicate<Member> predicate = (Member member) -> member.getAge() >= 18; 
        for (Member member : members) {
            if (predicate.test(member)) {
                member.printMember();;
            }
        }
    }

    public static class Member {
        private String name;
        private int age;
        public Member(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public int getAge() {
            return age;
        }

        public void printMember() {
            System.out.println(name + ", " + getAge());
        }
    }

    private static List<Member> createMembers() {
        List<Member> members = new ArrayList<>();
        members.add(new Member("Mathilda", 45));
        members.add(new Member("Clara", 15));
        members.add(new Member("Gloria", 18));
        return members;
    }

}

【问题讨论】:

  • 你试过从命令行运行它吗?
  • @RohitJain 不,我比 Netbeans 更讨厌命令行 ;-​​) 好奇:示例(使用 lambda)是否在您的上下文中运行,无论是 IDE 还是命令行?
  • 它在 IntelliJIdea 上运行良好。好吧,问题出在其他地方。您可能正在尝试运行不同的文件。您得到的错误仅表明这一点。确保您运行的是同一个文件。
  • @RohitJain 尝试过(有点):它是唯一一个具有该名称的名称 - 奇怪(对我而言)仅注释 lambda 并取消注释输入的谓词使其运行。怀疑这确实是类似愚蠢的东西(作为另一个文件),虽然

标签: java netbeans lambda java-8


【解决方案1】:

您的代码示例缺少 printMembers() 方法,但这似乎不是真正的问题。您遇到了我今天也遇到的 Netbeans 错误。似乎 Netbeans 开发人员将此超过四年的错误标记为“已解决”,但解决方案仍然相同:您必须在设置(项目属性/构建/编译)中关闭“保存时编译”选项,然后手动编译(例如按 F9)。然后就可以了。

如果未禁用该选项,您会在说“清理并构建”时看到正在创建的类文件,但在告诉 Netbeans 运行代码时会突然消失。

下一步,我建议 Josh M 对代码进行改进,这是您真正应该使用 lambdas 的方式。

【讨论】:

【解决方案2】:

这不是必须的,你应该尝试这样做:

members.stream().filter(m -&gt; m.getAge() &gt;= 18).forEach(Member::printMember);

【讨论】:

  • 后面在原始示例中 :-) 无论如何,谢谢 - 一旦我运行最简单的部分,肯定会尝试。更新:试过了,结果与 lambda 作为谓词相同(即没有运行相同的错误消息)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2011-01-25
相关资源
最近更新 更多