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

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

WBOY
WBOYavant
2024-02-22 13:28:061070parcourir

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");

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");

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

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

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

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

public <t> void maptoarende(list<t> t, list<classa> a){
        ...
           t objtouse = null;

Mais ça :

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

    comparator.comparing(t::getfromdat);
  • 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);
  • 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);
    }
}

L'appel est le suivant :

mapclasstoclassa(b, a, classb::getdate, classa::setclassb);
mapclasstoclassa(c, a, classc::getdate, classa::setclassc);

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 {
  ...
}

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer