Maison > Java > le corps du texte

Comment puis-je combiner ces deux méthodes en une seule ?

WBOY
Libérer: 2024-02-22 13:28:06
avant
1100 Les gens l'ont consulté

L'éditeur PHP Apple répondra à votre question en Java : Comment combiner deux méthodes en une seule ? En programmation Java, nous devons parfois fusionner deux méthodes en une méthode plus efficace pour améliorer la lisibilité et l'efficacité d'exécution du code. Grâce à la méthode de fusion, le code en double peut être réduit, la structure du programme peut être simplifiée et la réutilisabilité du code peut être améliorée. Ensuite, nous présenterons des étapes de fonctionnement et des précautions spécifiques pour vous aider à mettre en œuvre rapidement la fusion de méthodes et à optimiser la conception du programme Java.

Contenu de la question

J'ai deux méthodes très similaires. Je veux donc le réduire à une méthode mais je ne sais pas comment.

Utilisez comme ceci :

mapclassbtoclassa("a list o classb objs", "a list of classa objs");
mapclassctoclassa("a list o classc objs", "a list of classa objs");
Copier après la connexion

Je souhaite changer pour :

mapclasstoclassa("a list o classb objs", "a list of classa objs");
mapclasstoclassa("a list o classc objs", "a list of classa objs");
Copier après la connexion

Méthode 1b => a

public void mapclassbtoclassa(list<classb> b, list<classa> a){
   comparator<classb> sortfunc = comparator.comparing(classb::getdate);
   collections.sort(b, sortfunc);
   for (classa aobj : a){
      localdate datea = aobj.getdate();
      classb bobjtouse = null;
      for (classb bobj : b){
         localdate dateb = bobj.getdate();
         if (dateb.isafter(datea)){
            break;
         }
         else {
            bobjtouse = bobj; 
         } 
      }
      if (bobjtouse != null){
         aobj.setclassb(bobjtouse);
      }
   }
}
Copier après la connexion

Méthode 2c => a

public void mapclassctoclassa(list<classc> c, list<classa> a){
   comparator<classc> sortfunc = comparator.comparing(classc::getdate);
   collections.sort(c, sortfunc);
   for (classa aobj : a){
      localdate datea = aobj.getdate();
      classc cobjtouse = null;
      for (classc cobj : c){
         localdate datec = cobj.getdate();
         if (datec.isafter(datea)){
            break;
         }
         else {
            cobjtouse = cobj; 
         } 
      }
      if (cobjtouse != null){
         aobj.setclassc(cobjtouse);
      }
   }
}
Copier après la connexion

Je veux faire quelque chose de similaire :

public void mapclasstoclassa(list< **xx** > t, list<classa> a){
   comparator< **xx** > sortfunc = comparator.comparing( **xx** ::getdate);
   collections.sort( t , sortfunc);
   for (classa aobj : a){
      localdate datea = aobj.getdate();
      **xx** objtouse = null;
      for (**xx** obj : t){
         localdate datet = obj.getdate();
         if (datet.isafter(datea)){
            break;
         }
         else {
            objtouse = bobj; 
         } 
      }
      if (objtouse != null){
         aobj.setclassxxx(objtouse);
      }
   }
}
Copier après la connexion

J'ai essayé d'utiliser des génériques

public <t> void maptoarende(list<t> t, list<classa> a){
        ...
           t objtouse = null;
Copier après la connexion

Mais ça :

  • Je ne peux pas implémenter le comparateur car cela ne fonctionne pas

    comparator.comparing(t::getfromdat);
    Copier après la connexion
  • Au lieu d'un appel à obj.getdate(), j'ai trouvé ici une solution utilisant la réflexion, mais les gens la déconseillent. Mais ça marche. que dois-je faire?

    Method m = obj.getClass().getMethod("getDate");
    LocalDate dateT = (LocalDate) m.invoke(obj);
    Copier après la connexion
  • Je ne sais pas comment appeler aobj.setclassxxx() car les noms de méthodes de classb et classc sont différents

J'ai lu des articles sur les lambdas mais j'ai du mal à comprendre comment les utiliser.

Solution

Si vous ne parvenez pas à ajouter une interface commune à ces classes, vous pouvez ajouter quelques fonctions aux paramètres de la méthode :

public <t> void mapclasstoclassa(list<t> t, list<classa> a,
                                 function<t, localdate> dategetter,
                                 biconsumer<classa, t> setter) {

    comparator<t> sortfunc = comparator.comparing(dategetter);
    collections.sort(t, sortfunc);
    for (classa aobj : a) {
        localdate datea = aobj.getdate();
        t ttouse = null;
        for (t tobj : t){
            localdate datet = dategetter.apply(tobj);
            if (datet.isafter(datea)){
                break;
            }
            ttouse = tobj; 
        }
        setter.accept(aobj, tobjtouse);
    }
}
Copier après la connexion

L'appel est le suivant :

mapclasstoclassa(b, a, classb::getdate, classa::setclassb);
mapclasstoclassa(c, a, classc::getdate, classa::setclassc);
Copier après la connexion

C'est à ça que servent les interfaces, n'est-ce pas ?

public interface dated {
  localdate getdate();
} 

public class classb implements dated {
  ...
}

public class classc implements dated {
  ...
}
Copier après la connexion

Pour les setters, vous pouvez utiliser instanceof.

public void mapClassBToClassA(List<? extends Dated> b, List<ClassA> a){
   Comparator<Dated> sortFunc = Comparator.comparing(Dated::getDate);
   Collections.sort(b, sortFunc);
   for (ClassA aObj : a){
      LocalDate dateA = aObj.getDate();
      Dated datedToUse = null;
      for (Dated bObj : b){
         LocalDate dateB = bObj.getDate();
         if (dateB.isAfter(dateA)){
            break;
         }
         else {
            datedToUse = bObj; 
         } 
      }
      if (datedToUse instanceOf ClassB bObjToUse) {
         aObj.setClassB(bObjToUse);
      }
      else if (datedToUse instanceOf ClassC cObjToUse) {
         aObj.setClassC(cObjToUse);
      }
   }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal