2013-08-23 25 views
1

最後決定開始對jdk8的新功能進行一些實驗,即lambda expressions following the tutorial。爲方便起見,我簡化了示例,請參閱下面的SSCCE。簡單教程示例(lambda表達式)不運行

輸入謂詞運行良好,將其重構爲一個lambda表達式,如Netbeans編譯(?)建議(並且實際完成),但不會運行。的簡潔的控制檯打印輸出是

Fehler: Hauptklasse simple.Simple konnte nicht gefunden oder geladen werden

( 「錯誤:主類找不到或裝載」)

環境:

  • JDK:JDK-8-EA-倉-B102 -windows-i586-08_aug_2013.exe
  • Netbeans 7.4 beta,捆綁從14.7.2013。不知道這是最新的,不能從NetBeans網站下載

BTW,使用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; 
    } 

} 
+0

你試過從命令行運行它嗎? –

+0

@RohitJain不,我討厭命令行甚至超過Netbeans ;-)好奇:這個例子(使用lambda)在你的上下文中運行,不管是IDE還是命令行? – kleopatra

+0

它在IntelliJIdea上運行良好。那問題就在別的地方了。您可能試圖運行不同的文件。你得到的錯誤只是表明了這一點。確保你正在運行相同的文件。 –

回答

2

你的代碼示例缺少printMembers()方法,但是這似乎並不是真正的問題。你遇到了我今天遇到的Netbeans錯誤。看起來,Netbeans開發者將這個四年前的bug標記爲「已解決」,但解決方案仍然相同:您必須關閉設置(Project Properties/Build/Compiling)中的「Compile on Save」選項,然後手動編譯(例如按F9)。然後它工作。

如果選項未禁用,您將在看到「Clean and Build」時創建類文件,但在告知Netbeans運行代碼時突然消失。

作爲下一步,我建議通過Josh M的代碼改進,這是你真正應該如何使用lambdas。

+0

就是這樣 - 謝謝一堆!是的,現在我可以真正運行它了:-)順便說一下,你有Netbeans問題的bug嗎? – kleopatra

+0

我在這裏找到了解決方案http://stackoverflow.com/questions/3851592/netbeans-deleting-a-built-class但是課程檢測到類的消失是棘手的部分。提到消失類與該選項一起的錯誤在https://netbeans.org/bugzilla/show_bug.cgi?id=163169 – Holger

+0

感謝您的詳細信息!評論重複,據報道是固定的:https://netbeans.org/bugzilla/show_bug.cgi?id = 151845 – kleopatra

2

這是沒有必要的,你應該嘗試做這樣的事情:

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

+0

後來在原始示例中:-)無論如何,謝謝 - 一旦我運行最簡單的部分,肯定會嘗試。更新:嘗試它,與lambda作爲謂詞相同的結果(即,沒有運行相同的錯誤消息) – kleopatra