消费者表达式中的返回方法值

时间:2018-12-07 20:06:23

标签: java return consumer

我正在尝试在方法内部返回布尔值,而我正在使用使用者函数。 有什么办法可以直接在该Consumer表达式内返回该值?

这是代码:

private static boolean uuidExists(UUID uuid) {
    MySQL.getResult("", rs -> {
        try {
            if(rs.next()){
                return rs.getString("UUID") != null;
            }
        } catch (SQLException e) {
        }
    });

    return false;
}

编辑:

我知道我可以创建一个布尔值并更改该值,但我不想这样做。

编辑:

getResult代码:

public static void getResult(String qry, Consumer<ResultSet> consumer){
        new BukkitRunnable() {
            @Override
            public void run() {
                if(isConnected()) {
                    consumer.accept(Warpixel.getWarpixel().getStats().getResult(qry));
                    return;
                }
                consumer.accept(null);
            }
        }.runTaskAsynchronously(Bedwars.getMain());
    }

3 个答案:

答案 0 :(得分:2)

否,不可能。 lambda表达式是Consumer.accept的实现,因此不能返回值,因为该方法是无效的。

  

我知道我可以创建一个布尔值并更改该值,但我不想这样做。

也不是。在lambda表达式中,您只能引用final的局部变量(使其固有地不可能)。您将不得不使用其他技术(例如可修改的引用对象)来解决此限制。

可以建议的一种方法是在此处使用Future:

CompletableFuture<Boolean> future = new CompletableFuture<Boolean>();

MySQL.getResult("", rs -> {
    try {
        if(rs.next()){
            future.complete(rs.getString("UUID") != null);
        }
    } catch (SQLException e) {
        //handle exception
    }

    future.complete(false); //mind this default value
});

return future.join(); //this will block until the `Consumer` calls complete()

需要特别注意的是,这是一种阻止旨在异步执行的方法。

答案 1 :(得分:1)

这是一个lambda表达式,它在uuidExists方法完成后 后执行。您必须将接口用作回调(就像函数getResult一样)。

public interface UuidCallback {
    void onCompleted(boolean uuidExists);
}

它将在您getResult时执行。您必须将回调的附加参数传递给uuidExists

private static boolean uuidExists(UUID uuid, UuidCallback callback)

并在获得结果时调用完成的方法

if(rs.next()){
    callback.onCompleted(rs.getString("UUID") != null);
}

然后,在执行uuidExists时,您必须编写另一个lambda表达式:

uuidExists(someUUIDInstance, uuidExists -> {
    // boolean uuidExists now has your result
});

希望有帮助

答案 2 :(得分:1)

您的方法getResult声明为:

void getResult(String qry, Consumer<ResultSet> consumer){ ... }

其中Consumer<ResultSet>是一个函数接口,表示一个以ResultSet作为输入的函数,并且具有void返回类型。

您追求的是谓词,即Predicate<ResultSet>