J'ai deux méthodes similaires. L'un d'eux imprime quelque chose et l'un d'entre eux économisait quelque chose. Comme vous pouvez le constater, il y a beaucoup de code dupliqué. Comment dois-je le refroidir et supprimer cette duplication?
public static void printSomething(List<String> list) { for (String item : list) { if (item.contains("aaa")) { System.out.println("aaa" + item); } if (item.contains("bbb")) { System.out.println("bbb" + item); } else { System.out.println(item); } } } public static Map<String, String> getSomething(List<String> list) { Map<String, String> map = new HashMap<String, String>(); for (String item : list) { if (item.contains("aaa")) { map.put("aaa", item); } if (item.contains("bbb")) { map.put("bbb", item); } else { //do nothing } } return map; }
3 Réponses :
Dans un langage de programmation avec des fonctions de première classe, vous passeriez une fonction comme paramètre indiquant ce que vous souhaitez faire à l'intérieur de la boucle (pour un exemple, voir la mise à jour ci-dessous). Java va avoir des lambdas dans la version 8, mais ils ne sont pas tout à fait au travail.
Dans l'état actuel de Java, vous devrez vous installer avec quelque chose de plus laids - par exemple, en passant un paramètre supplémentaire à la méthode; Ou vous pouvez transmettre des classes intérieures anonymes qui mettent en œuvre une interface, mais IMHO qui est même plus laidienne que ce que je suis sur le point de suggérer: p> si update strong> p> par exemple, dans Python - qui permet de transmettre des fonctions en tant que paramètres, ce est la façon dont vous résoudriez le problème de manière élégante: p> voir comment ça marche: p> Imprimer code > est
true code> puis imprimez à l'intérieur de la boucle, sinon ajouter à la carte
code>. Bien sûr, vous devrez ajouter quelques
si code> s à l'intérieur de la boucle pour vérifier cette condition et au début, un
supplémentaire si code> pour déterminer si le
Carte code> doit être initialisé. De toute façon, la méthode renvoie une carte
code>, mais la carte
code> peut être
null code> pour le boîtier d'impression. C'est ce que je veux dire: p>
C'est un exemple très laid. Prénom de cette méthode imprimer ou obtenir ?? Deuxièmement, vous avez toujours nul alors vous ne retournez rien
Le nom pourrait être quelque chose de générique. Et la méthode doit rendre une carte toujours, même si c'est null
Bon conseil. Et vous pouvez toujours passer à une implémentation d'une interface - le modèle de délégué.
votre exemple fonctionnera certainement mais vous devez admettre que ce n'est pas un très bon exemple
@hudi en effet, c'est laid. Mais Java n'est plus un bon langage de programmation, il vous oblige à écrire beaucoup de code de la chaudron laid comme celui-ci, voire pire, un kilométrage de motifs et de classes intérieures anonymes. Il manque l'élégance et la puissance expressive des langues fonctionnelles.
et comment résoudre ce problème avec la langue qui appuie la fermeture (Groovy)
@hudi Voir ma réponse mise à jour. En outre, j'ai reformulé le premier paragraphe: il ne suffit pas d'avoir lambdas i>, vous avez besoin de fonctions de première classe - en ce sens, Java 8's Lambdas ne suffira pas pour résoudre ce problème
Fonction HM comme paramètre :) Très bien.
@hudi oui, plus agréable et moins verbeux que d'utiliser C # ou Java. C'est une honte que tu n'acceptions pas cette réponse: p
Oui désolé mais je demande comment résoudre ceci en Java. Votre exemple fonctionne aussi mais j'accepte un nettoyant
Assumer l'ordre de laquelle le println code> de
"AAA" code> et
"BBB" code> n'apparaît pas, vous pouvez remplacer la mise en œuvre de
impressionnant code> avec
+1. Cela suppose que l'ordre des impressions n'a pas d'importance.
HM THX Cela fonctionnera si la méthode sera la même, mais si l'impression contient: ... ele {system.out.println ("BBB" + article); } et obtenir ... ele {// donothing}
Cette solution manque le cas où élément code> ne contient pas "AAA" ou "BBB";
PrintSomettion Code> gère ce boîtier, mais
grossiste code> le dépose (peut-être a-t-il changé lorsque la question a été modifiée).
Une action d'interface générique qui a une méthode action (t t) peut réduire le code. Exemple: P> public static Map<String, String> getSomething2(List<String> list) {
final Map<String, String> map = new HashMap<String, String>();
forEach(list, new ListToMapAction(map));
return map;
}
public class ListToMapAction implements Action<String> {
Map<String, String> map;
public ListToMapAction(Map<String, String> map) {
this.map = map;
}
@Override
public void action(String e) {
if (e.contains("aaa")) {
map.put("aaa", e);
}
if (e.contains("bbb")) {
map.put("bbb", e);
} else {
// do nothing
}
}
}
désolé mais je ne comprends pas votre exemple. Votre méthode ne renvoie rien alors comment devrais-je obtenir ma carte?
Quand vous venez d'imprimer quelque chose? Je pense qu'il y aura encore quelques duplications dans l'action de la méthode
Oui, il sera répété: \ Sont les éléments "AAA" et "BBB" dans une liste? Si oui, vous pouvez comparer les deux listes et le code sera plus court.
Cela dépend ... Pourquoi avez-vous ces 2 méthodes ... Pouvez-vous partager les méthodes d'appel
Vous pouvez probablement utiliser la valeur de retour de
getomething () code> pour effectuer les impressions dans
impressionnant () code>; Je vais aller de cette façon afin d'éviter les méthodes qui ne rendent rien (qui ne sont pas des configurateurs OFC).
@Highperformancemark désolé pour une erreur. Je veux dire duplication
Cette édition a radicalement changé le problème, vous ne pouvez maintenant utiliser la deuxième méthode pour mettre en œuvre le premier plus.
@Keppil Je pense que le problème est toujours même = supprimer la duplication. Il s'agit probablement de changer de solution.
@hudl: Le problème est que vous invalendez des réponses à votre question précédente en effectuant ce changement. Vous feriez mieux de poser une nouvelle question alors.
ÊTES-VOUS SÛR
GAMESIATHIX QUE CODE> NE DOIT PAS RETOURNER
Carte> CODE> ou quelque chose comme ça? En ce moment, la carte
renvoyée code> ne contient que le last i> item in
Liste code> qui contenait
"AAA" code> et
et
"BBB" code>, qui semble très différent, alors comment
impressionnant code> se comporte (montrant tous les éléments i> contenant
"AAA" code>,
"BBB" code> ou non).