Java 8 地图<String, Runnable> 控制流程
Java 8 Map<String, Runnable> Control Flow
我正在尝试熟悉一些新的 Java 8 功能 (ha),但我遇到了一些控制流错误。
在下面的代码中,我有一个 Map<String, Runnable>
所以我可以根据它们的名称调用方法,但我似乎无法弄清楚如何做两件事:
- 如何让这些方法带参数? IE。我在地图 "put"s.
中需要的语法是什么
- 当我从“Dispatch”中的 "get" 方法调用这些方法时,我无法 return 方法的 return 值(状态)。我怀疑这与某些事情有关与调用方法的位置有关,但我无法弄清楚。状态只是一个枚举,toList 方法只采用 space 分隔的字符串和 returns 列表(这意味着用作 REPL)。
import java.util.*;
public class Dispatcher {
private Map<String, Runnable> func;
private Status status;
private List<String> command;
Optional<List<String>> opt;
public Dispatcher() {
func = new HashMap<>();
func.put("Method1", this::Method1);
func.put("Method2", this::Method2);
func.put("Help", this::Help);
status = Status.DONE;
}
private Status Help() {
return Status.DONE;
}
private Status Method1() {
return Status.DONE;
}
private Status Method2() {
return Status.DONE;
}
/**
* Execute the given command on a new process.
* @param command the full command requested by the caller including command name and arguments.
* @return The status of the requested operation.
*/
public Status Dispatch(String command) {
opt = CommandInterpreter.toList(command);
opt.orElse(new LinkedList<String>(){{add("Help");}});
func.get(opt.get().get(0));
return Status.DONE;
}
}
如果您希望方法接受参数,那么您不想将其存储为 Runnable
。您可能需要 Consumer
,或另一个接受参数的自定义功能接口——如果您需要 return 值,请使用 Function
,或创建您自己的接口。
Runnable
接口不接受任何参数或具有 return 类型。要添加 return 类型,您可以使用 Supplier<Status>
。要添加参数,请使用 Function<ParamType, Status>
.
这是一个框架,您可以如何开始处理采用零个或多个参数并返回状态代码的命令。它只是一个蓝图,一个例子。也许它可以帮助您入门:
public class Dispatcher {
public static final int SUCCESS = 0;
public static final int FAILURE = 1;
public static final Command HELP = (args) -> {
String command = args[0];
System.out.println("Usage of " + command + ": bla bla");
return FAILURE;
};
public static final Command RENAME = (args) -> {
File oldName = new File(args[1]);
File newName = new File(args[2]);
return oldName.renameTo(newName) ? SUCCESS : FAILURE;
};
public final Map<String, Command> commands = new HashMap<String, Command>() {{
put("help", HELP);
put("rename", RENAME);
}};
public int dispatch(String commandLine) {
String[] args = commandLine.split("\s");
return Optional.ofNullable(commands.get(args[0]))
.orElse(HELP)
.execute(args);
}
}
interface Command {
int execute(String... args);
}
我正在尝试熟悉一些新的 Java 8 功能 (ha),但我遇到了一些控制流错误。
在下面的代码中,我有一个 Map<String, Runnable>
所以我可以根据它们的名称调用方法,但我似乎无法弄清楚如何做两件事:
- 如何让这些方法带参数? IE。我在地图 "put"s. 中需要的语法是什么
- 当我从“Dispatch”中的 "get" 方法调用这些方法时,我无法 return 方法的 return 值(状态)。我怀疑这与某些事情有关与调用方法的位置有关,但我无法弄清楚。状态只是一个枚举,toList 方法只采用 space 分隔的字符串和 returns 列表(这意味着用作 REPL)。
import java.util.*;
public class Dispatcher {
private Map<String, Runnable> func;
private Status status;
private List<String> command;
Optional<List<String>> opt;
public Dispatcher() {
func = new HashMap<>();
func.put("Method1", this::Method1);
func.put("Method2", this::Method2);
func.put("Help", this::Help);
status = Status.DONE;
}
private Status Help() {
return Status.DONE;
}
private Status Method1() {
return Status.DONE;
}
private Status Method2() {
return Status.DONE;
}
/**
* Execute the given command on a new process.
* @param command the full command requested by the caller including command name and arguments.
* @return The status of the requested operation.
*/
public Status Dispatch(String command) {
opt = CommandInterpreter.toList(command);
opt.orElse(new LinkedList<String>(){{add("Help");}});
func.get(opt.get().get(0));
return Status.DONE;
}
}
如果您希望方法接受参数,那么您不想将其存储为 Runnable
。您可能需要 Consumer
,或另一个接受参数的自定义功能接口——如果您需要 return 值,请使用 Function
,或创建您自己的接口。
Runnable
接口不接受任何参数或具有 return 类型。要添加 return 类型,您可以使用 Supplier<Status>
。要添加参数,请使用 Function<ParamType, Status>
.
这是一个框架,您可以如何开始处理采用零个或多个参数并返回状态代码的命令。它只是一个蓝图,一个例子。也许它可以帮助您入门:
public class Dispatcher {
public static final int SUCCESS = 0;
public static final int FAILURE = 1;
public static final Command HELP = (args) -> {
String command = args[0];
System.out.println("Usage of " + command + ": bla bla");
return FAILURE;
};
public static final Command RENAME = (args) -> {
File oldName = new File(args[1]);
File newName = new File(args[2]);
return oldName.renameTo(newName) ? SUCCESS : FAILURE;
};
public final Map<String, Command> commands = new HashMap<String, Command>() {{
put("help", HELP);
put("rename", RENAME);
}};
public int dispatch(String commandLine) {
String[] args = commandLine.split("\s");
return Optional.ofNullable(commands.get(args[0]))
.orElse(HELP)
.execute(args);
}
}
interface Command {
int execute(String... args);
}