上一篇文章讲到,针对实例类型不同导致的代码重复给出了泛型的解决方法;
这次针对调用方法不同导致的代码重复也给出解决方法;
ps:本例中由于代码较为简洁,行数不多,就采用截图的方式先叙述了,代码在最后;
函数式编程解决因调用方法不同导致的代码重复
场景举例
通常,我们会由如下的场景:定义一个方法,方法有一个入参,然后在方法中处理入参
例:
现在将入参设置为一个具体的对象实例,然后在方法中调用实例的具体方法;
例:分别写两个方法去打印不同实例的属性
可以看到,上面的两个方法中,代码几乎一模一样;
将一个获取信息的方法作为入参
针对这种高重复率代码;可以使用函数式编程中的Function+泛型T进行优化,具体代码效果如下:
上图中,Function<T, String> getAttribute 表示入参是一个方法,“getAttribute”只是一个名字而已,随便取的,Function<T, String>中'T'表示的是方法的入参是一个T类型的对象(与"T obj"中obj相同的类型),‘String’表示该方法返回的类型是一个字符串;
然后在方法体内,getAttribute使用apply方法将obj作为入参(obj作为一个T类型的对象,可以作为getAttribute的入参),且getAttribute的返回值作为一个字符串被打印了出来;
原来相似度极高的两个方法就这样被“优雅”了;
将一个修改信息的方法作为入参
上面的例子中,我们传入的方法是一个获取信息的方法(就是get类的方法);这里拓展一下,如何将一个修改信息的方法作为入参(就是set类的方法)
如下:
代码
package others;
import java.util.function.Consumer;
import java.util.function.Function;
public class MyObject
{
public static void main(String[] args)
{
A objA = new A();
B objB = new B();
setAttribute(objA::setAttributeA,"attributeA");
setAttribute(objB::setAttributeB,"attributeB");
printAttribute(A::getAttributeA, objA);
printAttribute(B::getAttributeB, objB);
}
private static void setAttribute(Consumer<String> setAttribute,String attribute)
{
setAttribute.accept(attribute);
}
public static <T> void printAttribute(Function<T, String> getAttribute, T obj)
{
System.out.println(getAttribute.apply(obj));
}
}
A 和B 是两个十分简单的类,只有一个属性及其set和get方法,代码如下:
package others;
public class A
{
private String attribute;
public A()
{
}
public A(String attribute)
{
this.attribute = attribute;
}
public String getAttributeA()
{
return attribute;
}
public void setAttributeA(String attribute)
{
this.attribute = attribute;
}
}
package others;
public class B
{
private String attribute;
public B()
{
}
public B(String attribute)
{
this.attribute = attribute;
}
public String getAttributeB()
{
return attribute;
}
public void setAttributeB(String attribute)
{
this.attribute = attribute;
}
}