Rumah > Java > Bagaimanakah saya boleh menggabungkan kedua-dua kaedah ini menjadi satu?

Bagaimanakah saya boleh menggabungkan kedua-dua kaedah ini menjadi satu?

WBOY
Lepaskan: 2024-02-22 13:28:06
ke hadapan
1113 orang telah melayarinya

Editor PHP Apple akan menjawab soalan anda dalam Java: Bagaimana untuk menggabungkan dua kaedah menjadi satu? Dalam pengaturcaraan Java, kadangkala kita perlu menggabungkan dua kaedah kepada kaedah yang lebih cekap untuk meningkatkan kebolehbacaan dan kecekapan pelaksanaan kod. Dengan kaedah penggabungan, kod pendua boleh dikurangkan, struktur program dipermudahkan, dan kebolehgunaan semula kod dipertingkatkan. Seterusnya, kami akan memperkenalkan langkah pengendalian dan langkah berjaga-jaga khusus untuk membantu anda melaksanakan penggabungan kaedah dan mengoptimumkan reka bentuk program Java dengan cepat.

Kandungan soalan

Saya ada dua kaedah yang hampir sama. Jadi saya ingin mengurangkannya kepada kaedah tetapi saya tidak tahu bagaimana.

Gunakan seperti ini:

mapclassbtoclassa("a list o classb objs", "a list of classa objs");
mapclassctoclassa("a list o classc objs", "a list of classa objs");
Salin selepas log masuk

Saya nak tukar kepada:

mapclasstoclassa("a list o classb objs", "a list of classa objs");
mapclasstoclassa("a list o classc objs", "a list of classa objs");
Salin selepas log masuk

Kaedah 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);
      }
   }
}
Salin selepas log masuk

Kaedah 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);
      }
   }
}
Salin selepas log masuk

Saya mahu melakukan sesuatu yang serupa:

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);
      }
   }
}
Salin selepas log masuk

Saya cuba menggunakan generik

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

Tetapi ini:

  • Saya tidak dapat melaksanakan komparator kerana ini tidak berfungsi

    comparator.comparing(t::getfromdat);
    Salin selepas log masuk
  • Daripada panggilan ke obj.getdate(), di sini saya menemui penyelesaian menggunakan refleksi, tetapi orang ramai menasihatkannya. Tetapi ia berfungsi. apa yang saya buat?

    Method m = obj.getClass().getMethod("getDate");
    LocalDate dateT = (LocalDate) m.invoke(obj);
    Salin selepas log masuk
  • Saya tidak tahu bagaimana untuk memanggil aobj.setclassxxx() kerana nama kaedah classb dan classc adalah berbeza

Saya telah membaca tentang lambda tetapi saya mengalami sedikit kesukaran untuk memahami cara menggunakannya.

Penyelesaian

Jika anda tidak boleh menambah antara muka biasa pada kelas ini, anda boleh menambah beberapa fungsi pada parameter kaedah:

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);
    }
}
Salin selepas log masuk

Panggilan adalah seperti berikut:

mapclasstoclassa(b, a, classb::getdate, classa::setclassb);
mapclasstoclassa(c, a, classc::getdate, classa::setclassc);
Salin selepas log masuk

Itulah gunanya antara muka, bukan?

public interface dated {
  localdate getdate();
} 

public class classb implements dated {
  ...
}

public class classc implements dated {
  ...
}
Salin selepas log masuk

Untuk setter boleh guna 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);
      }
   }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah saya boleh menggabungkan kedua-dua kaedah ini menjadi satu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan