使用lambda表达式返回结果的Java方法引用

时间:2018-04-18 13:24:33

标签: java lambda java-8

我正在尝试使用lambda表达式学习Java 8中的方法引用,并遇到了一些我无法理解的内容。

我想将方法​​(1)传递给另一个方法(2),这样方法2调用方法1并使用方法1返回的值。

我已经在下面设置了一个代码片段,它与我想要的pesudo视角一样接近。换句话说,它在逻辑上不起作用,但应该让我们很容易理解我想要实现的目标。 if (function.run() == true)方法中的handleSomething部分完全错误,但如上所述,应指出我想要做的事情。

public class Test {
    public static void main(String[] args) {
        int testValue = 23;
        handleSomething(true, testValue, () -> checkIfZero(testValue));
        handleSomething(false, testValue, () -> checkIfLargerThanZero(testValue));
    }

    private static boolean checkIfZero(int value) {
        if (value == 0)
            return true;
        return false;
    }

    private static boolean checkIfLargerThanZero(int value) {
        if (value > 0)
            return true;
        return false;
    }

    private static int handleSomething(boolean test, int value, Runnable function) {
        if (test) {
            System.out.println("Ignore");
            return;
        }

        if (function.run() == true)
            System.out.println("Passed");
        else
            System.out.println("Failed");
    }
}

同样,if (function.run() == true)不起作用,因为run()只是从lambda表达式中调用方法,并且不会返回任何内容。

使用此设置执行我想要的操作的一种方法是将对象传递给包含布尔值的所有方法。引用方法可以在对象中设置boolean,使用引用方法的方法可以使用boolean。这种方法很有效,但是因为我需要将对象从外部传播到方法中而笨拙。

使用lambda表达式(不创建接口等)是否有更干净的方法?

1 个答案:

答案 0 :(得分:3)

使用@Holger提出的BooleanSupplier是一种可能的解决方案。

但我建议使用IntPredicate,因为这样可以将testValue从handleSomething传递给谓词:

import java.util.function.IntPredicate;

public class Test {
    public static void main(String[] args) {
        int testValue = 23;
        handleSomething(true, testValue, Test::checkIfZero);
        handleSomething(false, testValue, Test::checkIfLargerThanZero);
    }

    private static boolean checkIfZero(int value) {
        if (value == 0)
            return true;
        return false;
    }

    private static boolean checkIfLargerThanZero(int value) {
        if (value > 0)
            return true;
        return false;
    }

    private static void handleSomething(boolean test, int value, IntPredicate function) {
        if (test) {
            System.out.println("Ignore");
            return;
        }

        if (function.test(value))
            System.out.println("Passed");
        else
            System.out.println("Failed");
    }
}