gpt4 book ai didi

java - 创建 lambda 二维数组

转载 作者:行者123 更新时间:2023-11-30 07:54:36 28 4
gpt4 key购买 nike

所以我搜索了几个网站和其他关于此的问题,但似乎没有一个答案适合我。我有可用的代码,我的编程导师建议我将链式 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。根据我的阅读,需要一个接口(interface)。请记住,我不能使用 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 算法真的很陌生。

最佳答案

编译错误是由于这条语句:

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 表达式,映射是 lambda 的字符串表。

关于java - 创建 lambda 二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43977026/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com