创建lambda二维数组

时间:2017-05-15 10:23:06

标签: java lambda

所以我搜索了几个网站和其他人的问题,似乎没有一个答案对我有用。我的代码有效,我的编程导师建议我将链式if/else if更改为使用lambda表。我问过使用哈希表的东西,他说使用哈希只有9个项目(真正的程序有9个if / else语句)将是一种浪费。

我将使用if/else ifhash table发布工作代码,将其限制为3项,以保持代码简洁和甜蜜。

以下是if / else if ...

的代码
public class testLambda {
    String[] numArray = {"One", "Two", "Three"};

    testLambda(String num){
        if (num.equals(numArray[0])){
            printStringOne();
        } else if (num.equals(numArray[1])){
            printStringTwo();
        } else if (num.equals(numArray[2])){
            printStringThree();
        }
    }

    private void printStringOne(){
        System.out.println("1");
    }

    private void printStringTwo(){
        System.out.println("2");
    }

    private void printStringThree(){
        System.out.println("3");
    }

    public static void main(String[] args) {
        new testLambda("One");
        new testLambda("Three");
        new testLambda("Two");
    }
}

导致系统打印......

1
3
2

以下是哈希表的代码

import java.util.HashMap;
import java.util.Map;

public class testLambda {
    String[] numArray = {"One", "Two", "Three"};

    testLambda(String num){
        Map<String, Runnable> printNumber = new HashMap<>();

        printNumber.put(numArray[0], () -> printStringOne());
        printNumber.put(numArray[1], () -> printStringTwo());
        printNumber.put(numArray[2], () -> printStringThree());

        printNumber.get(num).run();
    }

    private void printStringOne(){
        System.out.println("1");
    }

    private void printStringTwo(){
        System.out.println("2");
    }

    private void printStringThree(){
        System.out.println("3");
    }

    public static void main(String[] args) {
        new testLambda("Three");
        new testLambda("One");
        new testLambda("Two");
    }
}

导致系统打印......

3
1
2

现在...... lambda。根据我的阅读,需要一个界面。请记住,我不能使用extends,因为我的应用程序已经扩展了另一个类(java不支持多重继承)这是我到目前为止所召唤的(不工作):

public class testLambda {
    String[] numArray = {"One", "Two", "Three"};

    public interface PrintNumber{
        void printNumber();
    }

    testLambda(String num){
        PrintNumber[] printNumbers = new PrintNumber[]{
                new PrintNumber() {public void printNumber(){printStringOne();}},
                new PrintNumber() {public void printNumber(){printStringTwo();}},
                new PrintNumber() {public void printNumber(){printStringThree();}}
        };

        for (int n = 0; n < numArray.length; n++){
            if (num.equals(numArray[n])){
                printNumbers[n];
            }
        }
    }

    private void printStringOne(){
        System.out.println("1");
    }

    private void printStringTwo(){
        System.out.println("2");
    }

    private void printStringThree(){
        System.out.println("3");
    }

    public static void main(String[] args) {
        new testLambda("Three");
        new testLambda("Two");
        new testLambda("One");
    }
}

这会导致编译错误。谁能告诉我我做错了什么?我是lambda算法的新手。

1 个答案:

答案 0 :(得分:3)

编译错误是由于此声明:

numArray[n];

这不是有效的声明。你想要的是这个:

    for (int n = 0; n < numArray.length; n++){
        if (num.equals(numArray[n])){
            createCharacters[n].printNumber();
        }
    }

但是,这依赖于保持两个独立的阵列同步,因此容易出错。我建议在所有内容中使用单个HashMap,并删除原始的numArray以支持HashMap:

public class testLambda {
    Map<String, Runnable> printNumber = new HashMap<>();
    static {
        printNumber.put("One", () -> printStringOne());
        printNumber.put("Two", () -> printStringTwo());
        printNumber.put("Three", () -> printStringThree());
    }

    testLambda(String num){
        printNumber.get(num).run();  // Add some checking here for robustness
    }

顺便说一下,你所谓的“lambda表”并不一定意味着它不能是HashMap。实际上,上面可以称为lambda表。 () -> printStringXXX();是lambda表达式,map是lambdas的字符串表。