Heim > Java > Wie kann ich diese beiden Methoden in einer kombinieren?

Wie kann ich diese beiden Methoden in einer kombinieren?

WBOY
Freigeben: 2024-02-22 13:28:06
nach vorne
1138 Leute haben es durchsucht

PHP-Editor Apple beantwortet Ihre Frage in Java: Wie kombiniere ich zwei Methoden zu einer? Bei der Java-Programmierung müssen wir manchmal zwei Methoden zu einer effizienteren Methode zusammenführen, um die Lesbarkeit und Ausführungseffizienz des Codes zu verbessern. Durch die Zusammenführungsmethode kann doppelter Code reduziert, die Programmstruktur vereinfacht und die Wiederverwendbarkeit des Codes verbessert werden. Als Nächstes stellen wir spezifische Betriebsschritte und Vorsichtsmaßnahmen vor, die Ihnen dabei helfen, die Methodenzusammenführung schnell zu implementieren und das Java-Programmdesign zu optimieren.

Frageninhalt

Ich habe zwei sehr ähnliche Methoden. Ich möchte es also auf eine Methode reduzieren, weiß aber nicht wie.

Verwenden Sie es wie folgt:

mapclassbtoclassa("a list o classb objs", "a list of classa objs");
mapclassctoclassa("a list o classc objs", "a list of classa objs");
Nach dem Login kopieren

Ich möchte ändern zu:

mapclasstoclassa("a list o classb objs", "a list of classa objs");
mapclasstoclassa("a list o classc objs", "a list of classa objs");
Nach dem Login kopieren

Methode 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);
      }
   }
}
Nach dem Login kopieren

Methode 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);
      }
   }
}
Nach dem Login kopieren

Ich möchte etwas Ähnliches machen:

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);
      }
   }
}
Nach dem Login kopieren

Ich habe versucht, Generika zu verwenden

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

Aber das:

  • Ich kann den Komparator nicht implementieren, weil das nicht funktioniert

    comparator.comparing(t::getfromdat);
    Nach dem Login kopieren
  • Anstelle eines Aufrufs von obj.getdate() habe ich hier eine Lösung mithilfe von Reflektion gefunden, aber die Leute raten davon ab. Aber es funktioniert. was mache ich?

    Method m = obj.getClass().getMethod("getDate");
    LocalDate dateT = (LocalDate) m.invoke(obj);
    Nach dem Login kopieren
  • Ich weiß nicht, wie man aobj.setclassxxx() aufruft, da die Methodennamen von classb und classc unterschiedlich sind

Ich habe über Lambdas gelesen, habe aber Schwierigkeiten zu verstehen, wie man sie verwendet.

Workaround

Wenn Sie diesen Klassen keine gemeinsame Schnittstelle hinzufügen können, können Sie den Methodenparametern einige Funktionen hinzufügen:

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);
    }
}
Nach dem Login kopieren

Der Aufruf lautet wie folgt:

mapclasstoclassa(b, a, classb::getdate, classa::setclassb);
mapclasstoclassa(c, a, classc::getdate, classa::setclassc);
Nach dem Login kopieren

Dafür gibt es doch Schnittstellen, nicht wahr?

public interface dated {
  localdate getdate();
} 

public class classb implements dated {
  ...
}

public class classc implements dated {
  ...
}
Nach dem Login kopieren

Für Setter können Sie instanceof verwenden.

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);
      }
   }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich diese beiden Methoden in einer kombinieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage