2014-10-10 64 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