解决方法·调用方法不同导致的代码重复·函数式编程

上一篇文章讲到,针对实例类型不同导致的代码重复给出了泛型的解决方法;

这次针对调用方法不同导致的代码重复也给出解决方法;

 

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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值