Java 第一次尝试在lambda

Java 第一次尝试在lambda,java,lambda,java-8,Java,Lambda,Java 8,我试图制作我的第一个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", "Mich

我试图制作我的第一个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();
    }

}

您的项目中没有使用Java8。它在Java8中编译得很好。但是,这一行中有一个bug:

return (String[]) filteredNames.toArray();
如果要返回数组,请将return语句更改为

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

您的项目中没有使用Java8。它在Java8中编译得很好。但是,这一行中有一个bug:

return (String[]) filteredNames.toArray();
如果要返回数组,请将return语句更改为

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

下面是使用Java8编译时可以使用的代码。请注意,您的所有错误都与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()]);
    }


}
公共类Lambda{
公共静态void main(字符串[]args){
最后一个字符串[]name={“Wim”、“Kian”、“Dirk”、“Emmanuel”、“Frank”、“Michael”、“Anna”、“Damien”、“Alberto”};
最终字符串[]filteredNames=getNamesWithCriteria(名称,(字符串s)->s.startsWith(“A”);
}
//将方法更改为静态
私有静态字符串[]getNamesWithCriteria(最终字符串[]名称,谓词){
final ArrayList filteredNames=新ArrayList();
for(字符串名称:名称){
if(谓词测试(名称)){
filteredNames.add(名称);
}
}
//正确转换为字符串[]
返回filteredNames.toArray(新字符串[filteredNames.size()]);
}
}

以下是使用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()]);
    }


}
公共类Lambda{
公共静态void main(字符串[]args){
最后一个字符串[]name={“Wim”、“Kian”、“Dirk”、“Emmanuel”、“Frank”、“Michael”、“Anna”、“Damien”、“Alberto”};
最终字符串[]filteredNames=getNamesWithCriteria(名称,(字符串s)->s.startsWith(“A”);
}
//将方法更改为静态
私有静态字符串[]getNamesWithCriteria(最终字符串[]名称,谓词){
final ArrayList filteredNames=新ArrayList();
for(字符串名称:名称){
if(谓词测试(名称)){
filteredNames.add(名称);
}
}
//正确转换为字符串[]
返回filteredNames.toArray(新字符串[filteredNames.size()]);
}
}

A您确定要用Java 8编译代码吗?您可能正在运行JDK 8,但我打赌源代码级别设置为8之前。设置
javac-source 1.8-target 1.8
。现在,它需要结束强制转换
(String)
。除了您可能没有在Java 8中编译代码之外,您还从静态上下文调用了非静态方法getNamesWithCriteria。a您确定要在Java 8中编译代码吗?您可能正在运行JDK 8,但我打赌源代码级别设置为8之前。设置
javac-source 1.8-target 1.8
。现在,它期望强制转换
(String)
结束。除了您可能不是在Java 8中编译代码之外,您还从静态上下文调用了非静态方法getNamesWithCriteria。好吧,奇怪。我做了java版本,上面写着1.8。但是当我做javac版本时,它说的是1.7。这怎么可能?你安装了两个JDK吗?好的,这就是原因:H:\>where java C:\ProgramData\Oracle\java\javapath\java.exe C:\Windows\System32\java.exe C:\Program Files\java\ibm\U sdk70\bin\java.exe H:\>where javac:\Program Files\java\ibm\U sdk70\bin\javac.exe。我做了java版本,上面写着1.8。但是当我做javac版本时,它说的是1.7。这是怎么可能的?您安装了两个JDK吗?好的,这就是原因:H:\>where java C:\ProgramData\Oracle\java\javapath\java.exe C:\Windows\System32\java.exe C:\Program Files\java\ibm\U sdk70\bin\java.exe H:\>where javac:\Program Files\java\ibm\U sdk70\bin\javac.exe谢谢。最大的问题是有多个JDK。最大的问题是有多个JDK。