Java 8 Lambda(来自JavaScript示例)

4

我从JavaScript背景开始学习Java,并想知道是否在Java中编写类似的函数是可能的。以下是JavaScript示例:

function getBalance(side, date) {
    let balance;
    let getPrice = (f) => {
        while ((result = f(date)) == 0) {
            date++;
        }
        return result;
    }
    if (side) {
        let price = getPrice(getPrice1);
        // Some calculations
        return balance;
    } else {
        let price = getPrice(getPrice2);
        // Some calculations
        return balance;
    }
}

在这里,getPrice1和getPrice2是事先定义的函数。使用回调有助于使代码简洁。我不确定在Java中是否可以在不声明额外接口的情况下将函数作为参数传递。

我之所以问这个问题,是因为它是我遇到的一个真实任务的简化示例。您认为最优雅的解决方案是什么?

P.S. 看起来函数式接口是这里的方法。


请查看此链接:https://dev59.com/3GIk5IYBdhLWcg3wTcfp - Shubham Dixit
1
也许您正在寻找功能接口? - Amongalen
这回答您的问题吗?Java中的回调方法是什么?(术语似乎使用得很宽泛) - Nicktar
1
在我看来,Java程序员更习惯于依赖面向对象编程(OOP),而JavaScript程序员更习惯于依赖函数式代码。虽然接受的答案展示了一个肯定可行的并行方式,但根据我的经验,在企业代码中很少会发现这样的代码。通常你会发现一个getPrice方法接受一个接口实例,并调用该接口定义的方法,在两个不同的类中以不同的方式实现。 - Aaron
2个回答

4
这里有一个解决方案,它看起来非常接近JavaScript代码:
import java.time.LocalDate;

public class Showcase {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();

        double result1 = getPrice(priceFunction1, date);
        double result2 = getPrice(priceFunction2, date);
    }

    private static double getPrice(PriceFunction priceFunction, LocalDate date) {
        return priceFunction.getPrice(date);
    }

    private static final PriceFunction priceFunction1 = date -> date.getYear() * 0.5;
    private static final PriceFunction priceFunction2 = date -> date.getYear() * 1.5;

    @FunctionalInterface
    private interface PriceFunction {
        double getPrice(LocalDate date);
    }
}

不要使用Java语言中的标准函数接口,例如Function,而是定义一个新的函数接口,完全满足您函数的要求:它接受日期并返回双精度浮点值。

getPrice函数将这样的“函数”作为第一个参数,然后我们必须传递日期(JavaScript作用域使其有点更容易...)。这些“函数”本身是lambda表达式,我们可以将它们存储为字段或静态常量。

纯洁主义者可能会因为我没有为名称选择大写命名而尖叫,但出于可读性考虑,我故意偏离了通常的命名约定。


3

是的,这是可能的。

以下是一个虚拟演示,只是为了说明如何组合事物。

class Showcase {

    public static void main(String[] args) {
        Function<Function<LocalDate, Double>, Double> getPrice = f -> {
            // an example how to call it - replace it with your logic
            f.apply(LocalDate.now());

            return 0.;
        };

        getPrice.apply(Showcase::getPrice1);
        getPrice.apply(Showcase::getPrice2);
    }

    public static Double getPrice1(LocalDate date) {
        return 0.;
    }

    public static Double getPrice2(LocalDate date) {
        return 1.;
    }

}

由于类型约束的原因,这将会更加冗长。然而,这个想法基本上是相同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接