2016-12-22 1 views
2

Ich versuche, mich mit einigen neuen Java 8-Funktionen vertraut zu machen (ha), aber ich habe einige Kontrollfehler.Java 8 Map <String, Runnable> Kontrollfluss

Im folgenden Code habe ich ein Map<String, Runnable> so kann ich basierend auf ihren Namen Methoden aufrufen, aber ich kann nicht scheinen, um herauszufinden, wie zwei Dinge zu tun:

  1. Wie kann ich diese Methoden machen Parameter nehmen? I.e. Was ist die Syntax, die ich in der Karte "put" s brauche.
  2. Wenn ich diese Methoden von der "get" -Methode in "Dispatch" aufrufen, kann ich den Rückgabewert der Methode (Status) nicht zurückgeben. Ich vermute, das hat etwas damit zu tun, wo die Methode aufgerufen wird, aber ich kann ' t es herausfinden. der Status ist nur ein eNUM und die ToList Verfahren dauert nur ein Leerzeichen getrennte Zeichenfolge und gibt eine Liste (dies als REPL verwendet werden soll).

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

Antwort

3

Hier ist ein Skelett, wie Sie beginnen können, mit Befehlen umzugehen, die null oder mehr Argumente nehmen und einen Statuscode zurückgeben. Es ist nur eine Blaupause, ein Beispiel. Vielleicht hilft es Ihnen beim Einstieg:

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

Wenn Sie Möchten Sie, dass die Methoden Argumente übernehmen, dann möchten Sie sie nicht als Runnable speichern. Möglicherweise möchten Sie Consumer oder ein anderes benutzerdefiniertes funktionales Interface, das den Anforderungen entspricht Gibt ein Argument aus - Wenn Sie einen Rückgabewert wünschen, verwenden Sie Function, oder erstellen Sie eine eigene Schnittstelle.

1

Die Schnittstelle Runnable akzeptiert keine Parameter oder einen Rückgabetyp. Um einen Rückgabetyp hinzuzufügen, können Sie Supplier<Status> verwenden. Um einen Parameter hinzuzufügen, verwenden Sie Function<ParamType, Status>.

Verwandte Themen