2016-12-22 5 views
2

新しいJava 8の機能(ハ)に慣れようとしていますが、コントロールフローの問題があります。次のコードでJava 8 Map <String、Runnable>コントロールフロー

、私はので、私は自分の名前に基づいた方法をMap<String, Runnable>を呼び出すことができますが、私は2つのことを行う方法を見つけ出すように見えることはできません。

  1. どのように私はこれらのメソッドを作ることができますパラメータを取る?私。私はマップ "put"で必要な構文は何ですか?
  2. "Dispatch"の "get"メソッドからこれらのメソッドを呼び出すと、メソッドの戻り値(Status)を返すことができません。これは、メソッドが呼び出されている場所と関係がありますが、トンそれを把握する。状況は、ちょうど列挙し、ToListメソッドメソッドは、単に(これは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; 
    } 
} 

答えて

3

ここでは、ゼロまたはそれ以上の引数をとり、ステータスコードを返すコマンドを扱う方法を説明します。それは単に青写真、例です。おそらく、それはあなたが始めるのに役立ちます:

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); 
} 
3

をあなたの場合メソッドが引数を取るようにしたい場合は、Runnableとして格納したくない場合があります。Consumer、またはacc引数をepts - 戻り値が必要な場合はFunctionを使用するか、独自のインターフェイスを作成します。

1

Runnableインターフェイスはパラメータを受け入れず、戻り値の型もありません。戻り値の型を追加するには、Supplier<Status>を使用します。パラメータを追加するには、Function<ParamType, Status>を使用します。

関連する問題