php小编苹果为您解答java中的问题:如何将两种方法合二为一?在java编程中,有时候我们需要将两个方法合并成一个更高效的方法,以提高代码的可读性和执行效率。通过合并方法,可以减少重复代码,简化程序结构,提高代码复用性。接下来,我们将介绍具体的操作步骤和注意事项,帮助您快速实现方法合并,优化java程序设计。
我有两种非常相似的方法。所以我想将其简化为一种方法,但我不知道该怎么做。
像这样使用:
mapclassbtoclassa("a list o classb objs", "a list of classa objs");
mapclassctoclassa("a list o classc objs", "a list of classa objs");我想更改为:
mapclasstoclassa("a list o classb objs", "a list of classa objs");
mapclasstoclassa("a list o classc objs", "a list of classa objs");方法一b => 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);
}
}
}方法二c => 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);
}
}
}我想做一些类似的事情:
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);
}
}
}我尝试使用泛型
public <t> void maptoarende(list<t> t, list<classa> a){
...
t objtouse = null;但是这样:
我无法执行比较器,因为这不起作用
comparator.comparing(t::getfromdat);
而不是对 obj.getdate() 的调用,这里我找到了使用反射的解决方案,但人们建议不要这样做。但它有效。我该怎么办?
Method m = obj.getClass().getMethod("getDate");
LocalDate dateT = (LocalDate) m.invoke(obj);我不知道如何调用 aobj.setclassxxx(),因为 classb 和 classc 的方法名称不同
我读过有关 lambda 的内容,但在了解如何使用它们方面遇到一些困难。
如果您无法向这些类添加通用接口,您可以向方法参数添加一些函数:
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);
}
}
调用如下:
mapclasstoclassa(b, a, classb::getdate, classa::setclassb); mapclasstoclassa(c, a, classc::getdate, classa::setclassc);
这就是接口的用途,不是吗?
public interface dated {
localdate getdate();
}
public class classb implements dated {
...
}
public class classc implements dated {
...
}对于设置器,您可以使用 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);
}
}
}以上就是如何将这两种方法合二为一?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号