首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单教程示例(lambda表达式)不运行

简单教程示例(lambda表达式)不运行
EN

Stack Overflow用户
提问于 2013-08-23 15:12:52
回答 2查看 26K关注 0票数 1

最后,决定开始对jdk8的新特性,即本教程后面的lambda表达式进行一些实验。为了方便起见,我简化了示例,请参阅下面的SSCCE。

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

Fehler: simple.Simple konnte gefunden oder geladen oder

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

环境:

  • jdk: jdk-8-ea-bin-b102-windows-i586-08_aug_2013.exe
  • Netbeans 7.4 beta版,捆绑自14.7.2013。不确定这是否是最新的,无法从Netbeans网站下载(单击其下载链接时得到“内容编码错误”)

顺便说一句,考虑使用Netbeans只是因为它已经支持jdk8 (如果不是netbeans,还有谁;-) -来自efxclipse的eclipse预览有一个类似的问题(编译,但不运行示例)。所以我肯定离开了我的舒适区,可能是我犯了什么愚蠢的错误.?

代码语言:javascript
复制
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;
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-23 15:35:20

您的代码示例缺少printMembers()方法,但是这似乎不是真正的问题。你遇到了一个网虫,我今天也碰到了。Netbeans开发人员似乎已经将这个四年前的bug标记为“解决了的”,但是解决方案仍然是一样的:您必须关闭设置中的“编译对保存”选项(Properties/Build/ compile ),然后手动编译(例如按F9)。那就成功了。

使用未禁用的选项,您将看到类文件正在创建时说“清洁和构建”,但突然消失时,告诉Netbeans运行代码。

作为下一步,我建议由Josh M改进代码,这就是您真正应该使用lambda的方式。

票数 3
EN

Stack Overflow用户

发布于 2013-08-23 15:22:03

这是不必要的,您应该尝试这样做:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18406268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档