2014-10-10 66 views
0

我試圖做出我的第一個lambda示例,但是我無法得到這個簡單的代碼來工作。首先嚐試lambda

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

public class Lambda { 

    public static void main(String[] args) { 
     final String[] names = {"Wim", "Kian", "Dirk", "Emmanuel", "Frank", "Michaël", "Anna", "Damien", "Alberto"}; 
     final String[] filteredNames = getNamesWithCriteria(names, (String s) -> s.startsWith("A")); 
} 

    private String[] getNamesWithCriteria(final String[] names, Predicate<String> predicate) { 
     final ArrayList<String> filteredNames = new ArrayList<>(); 
     for(String name : names) { 
      if(predicate.test(name)) { 
       filteredNames.add(name); 
      } 
     } 
     return (String[]) filteredNames.toArray(); 
    } 

} 

這是我得到的錯誤:

Lambda.java:8: error: ')' expected 
     final String[] filteredNames = getNamesWithCriteria(names, (String s) -> 
s.startsWith("A")); 
                     ^
Lambda.java:8: error: illegal start of expression 
     final String[] filteredNames = getNamesWithCriteria(names, (String s) -> 
s.startsWith("A")); 
                      ^

Lambda.java:8: error: ';' expected 
     final String[] filteredNames = getNamesWithCriteria(names, (String s) -> 
s.startsWith("A")); 
+3

一個你確定你編譯代碼Java中8? – Eran 2014-10-10 12:37:09

+0

您可能正在運行JDK 8,但我敢打賭,源代碼級別是在8之前設置的。設置'javac -source 1.8 -target 1.8'。它現在期待一個強制轉換'(String)'的結束。 – 2014-10-10 12:40:08

+2

除了你不可能在Java 8中編譯你的代碼,你還從靜態上下文中調用了非靜態方法getNamesWithCriteria。 – 2014-10-10 12:41:48

回答

2

你是不是在你的項目中使用Java 8。它編譯罰款這裏的Java 8。但是你在這一行中的錯誤:

return (String[]) filteredNames.toArray(); 

如果你想返回一個數組,改變return語句這一點。

return filteredNames.toArray(new String[filteredNames.size()]); 
+0

好奇怪。我做了java -version,它說1.8。但是當我做javac -version時它說1.7。這怎麼可能? – Juru 2014-10-10 12:46:29

+0

您是否安裝了兩個JDK? – PeterK 2014-10-10 12:47:15

+0

好的這是爲什麼:H:\>其中java C:\ ProgramData \ Oracle \ Java \ javapath \ java.exe C:\ Windows \ System32 \ java.exe C:\ Program Files \ Java \ ibm_sdk70 \ bin \ java.exe H:\>其中javac C:\ Program Files \ Java \ ibm_sdk70 \ bin \ javac.exe – Juru 2014-10-10 12:47:36

2

下面是當與Java 8.注意編譯您所有的錯誤都不能與Java 8層的功能,工作代碼:

public class Lambda { 

    public static void main(String[] args) { 
     final String[] names = {"Wim", "Kian", "Dirk", "Emmanuel", "Frank", "Michael", "Anna", "Damien", "Alberto"}; 
     final String[] filteredNames = getNamesWithCriteria(names, (String s) -> s.startsWith("A")); 

    } 

    // changed method to be static 
    private static String[] getNamesWithCriteria(final String[] names, Predicate<String> predicate) { 
     final ArrayList<String> filteredNames = new ArrayList<>(); 
     for(String name : names) { 
      if(predicate.test(name)) { 
       filteredNames.add(name); 
      } 
     } 
     // proper conversion to String[] 
     return filteredNames.toArray(new String[filteredNames.size()]); 
    } 


} 
+0

謝謝。最大的問題是有多個JDK。 – Juru 2014-10-10 13:03:34

相關問題