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

Wie kann ich diese beiden Methoden in einer kombinieren?

WBOY
WBOYnach vorne
2024-02-22 13:28:061115Durchsuche

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

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

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

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

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

Ich habe versucht, Generika zu verwenden

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

Aber das:

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

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

Der Aufruf lautet wie folgt:

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

Dafür gibt es doch Schnittstellen, nicht wahr?

public interface dated {
  localdate getdate();
} 

public class classb implements dated {
  ...
}

public class classc implements dated {
  ...
}

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen