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