2017-03-10 1 views
2

J'ai une méthode principale comme ceci:Comment prendre des valeurs de la ligne de commande dans une liste de POJO

public static void main(String[] args) { 

     // Implement null checks 
     ProfileData profileData = new ProfileData(); 


     try { 
       profileData.setaJIO(args[0]!=null?args[0]:""); 
       profileData.setAutopayCreated(args[1]!=null?args[1]:""); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
} 

J'ai un objet ProfileData qui est un POJO et compte environ 100 entrées, je me attendre à charger cet objet à partir de la ligne de commande, cependant, il devient fastidieux de remplir toutes ces entrées manuellement dans la méthode principale. Y a-t-il un moyen de le faire dans une boucle for?

Cependant je suis bloqué au point comme dans comment faire référence au pojo et ses éléments basés sur l'index dans la méthode principale? Toute aide serait appréciée

regardant quelque chose qui me permet de présenter une boucle dans l'extrait ci-dessous:

try { 
       profileData.setaJIO(args[0]!=null?args[0]:""); 
       profileData.setAutopayCreated(args[1]!=null?args[1]:""); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
+0

Vous devez simplifier la conception, vous pouvez introduire une classe 'ArgumentParser'. Ensuite, la méthode principale appellera simplement une méthode en passant le tableau complet. Cela changera la responsabilité d'analyse de la classe principale à la classe séparée. – Azodious

+0

Je dois encore le faire manuellement – User3

+0

Il y a une façon complexe de le faire et il faudra beaucoup moins de lignes de code. Vous pouvez le faire en utilisant spring, avoir une classe de service pour chaque variable et dans une boucle for charger le bean et exécuter la méthode. Cela semble drôle mais si vous avez une analyse trépidante à faire, vous facilitera la tâche. – Azodious

Répondre

1

En Kotlin vous pouvez écrire quelque chose comme ceci:

class Test(map: Map<String, Any?>) { 
    val name: String by map 
    val age: String  by map 

    override fun toString(): String { 
     return "Test[$name, $age]" 
    } 
} 

fun parseArgs(args: Array<String>): Test { 
    val zipArgs: List<Pair<String, String>> = args.zip(args.drop(1)) 

    val paramMap = zipArgs.mapNotNull { (name, param) -> 
     if (!name.contains("-")) 
      [email protected] null 

     name.substringAfter("-") to param 
    }.toMap() 

    return Test(paramMap) 
} 

fun main(args: Array<String>) { 
    val testArgs = arrayOf("-name", "testName", "-age", "123") 

    val test = parseArgs(testArgs) 

    println(test) 
} 
+0

Merci, mais j'utilise Java – User3

0

Hope this helps quelque peu. Assurez-vous que le constructeur dans ProfileData accepte deux variables.

public static void main(String[] args) { 

    List<ProfileData>data = new ArrayList<>(); 

    try { 
     for(int i = 0; i < args.length-1; i=i+2){ 
      data.add(new ProfileData(args[i], args[i+1])); 
     } 

     for (ProfileData pd : data) { 
      System.out.println(pd.getjIO() + " " + pd.getAutopayCreated()); 
     } 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
}