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.
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");
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");
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); } } }
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); } } }
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); } } }
Saya cuba menggunakan generik
public <t> void maptoarende(list<t> t, list<classa> a){ ... t objtouse = null;
Tetapi ini:
Saya tidak dapat melaksanakan komparator kerana ini tidak berfungsi
comparator.comparing(t::getfromdat);
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);
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.
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); } }
Panggilan adalah seperti berikut:
mapclasstoclassa(b, a, classb::getdate, classa::setclassb); mapclasstoclassa(c, a, classc::getdate, classa::setclassc);
Itulah gunanya antara muka, bukan?
public interface dated { localdate getdate(); } public class classb implements dated { ... } public class classc implements dated { ... }
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); } } }
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!