函数式编程-将过程作为返回值的应用:获取未来的数据

之前的文章利用一等函数(First-class Function)的“可以将过程作为返回值”这一点来实现分步过程,本文介绍一种该性质极其相似另一种用途-获取未来的数据。

(注意:本文旨在介绍一种编程技巧,希望可以给读者一点启发,并非介绍某类问题的最优解,实际使用还需具体问题具体分析)

问题场景

平常在编写一个过程的时候,除了参数以外我们还可能使用一些局部变量/全局变量,例如:

public class Demo {
    public String doSomething(int x) {
        int y = 0;
        for (int i = 1; i <= x; i++) {
            y += i;
        }

        int z = getFromXXX();
        for (int i = 1; i <= x; i++) {
            z += i;
        }

        return z + ":" + y;
    }
}

但是吧,有时候总会遇到一些特殊情况导致一些数据暂时取不到,例如上面程序中的z,那么我们可能写成:

public class Demo {
    int y = -1;
    int x = -1;

    public void doSomethingPart1(int x) {
        this.x = x;
        y = 0;
        for (int i = 1; i <= x; i++) {
            y += i;
        }
    }

    public String doSomethingPart2(int z) {
        for (int i = 1; i <= x; i++) {
            z += i;
        }

        return z + ":" + y;
    }
}

这段程序有以下问题:

  1. doSomethingPart1doSomethingPart2并没有强制指定先后执行,它们可以以任意顺序执行;
  2. 引入额外的“全局”变量xy,随着功能增加,值可能被错误的修改更新;

这里我们的问题是z暂时取不到/不知道怎么得到z,但我们知道如何处理z,那么我们假定未来可以取到z,然后在那个时候再执行剩余的过程就行了。

获取未来数据的实现

“获取未来的数据”其实就是“把过程延迟到未来执行”:

public class FutureDataDemo {
    public Function<Integer, String> doSomething(int x) {
        int a = 0;
        for (int i = 1; i <= x; i++) {
            a += i;
        }
        int y = a;

        return (Integer z) -> {
            for (int i = 1; i <= x; i++) {
                z += i;
            }

            return z + ":" + y;
        };
    }
}

这样既没有引入额外全局变量,也没有定义多个方法,且在表达上达到了和第一个示例中一样的连贯性。

(写在最后:如果内容和你预期的不同,那是我的问题:我是标题党。如果有所收获,那再好不过)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值