Java 在使用者表达式中返回方法值

Java 在使用者表达式中返回方法值,java,return,consumer,Java,Return,Consumer,我试图在一个方法中返回一个布尔值,我正在使用一个消费者函数。 有没有办法直接在消费者表达式中返回该值 代码如下: private static boolean uuidExists(UUID uuid) { MySQL.getResult("", rs -> { try { if(rs.next()){ return rs.getString("UUID") != null; }

我试图在一个方法中返回一个布尔值,我正在使用一个消费者函数。 有没有办法直接在消费者表达式中返回该值

代码如下:

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());
    }
publicstaticvoidgetresult(字符串qry,使用者){
新的bukkitrunable(){
@凌驾
公开募捐{
如果(断开连接()){
accept(Warpixel.getWarpixel().getStats().getResult(qry));
返回;
}
consumer.accept(null);
}
}.runTaskAsynchronously(Bedwars.getMain());
}

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

它将在您
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
});

希望它有帮助

您的方法
getResult
声明为:

void getResult(String qry, Consumer<ResultSet> consumer){ ... }
void getResult(字符串qry,使用者){…}
其中,
Consumer
是一个函数接口,表示将
ResultSet
作为输入的函数,并具有无效返回类型


你所追求的被称为谓词,即
谓词

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

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

也不是。在lambda表达式中,只能引用最终的局部变量(这使得它本身不可能)。您必须使用其他技术(例如可修改的引用对象)来绕过此限制

可以建议的一种方法是在这里使用未来:

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()
CompletableFuture=newcompletablefuture();
MySQL.getResult(“,rs->{
试一试{
如果(rs.next()){
future.complete(rs.getString(“UUID”)!=null);
}
}捕获(SQLE异常){
//处理异常
}
future.complete(false);//注意这个默认值
});
返回future.join()//这将一直阻止,直到'Consumer'调用complete()

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

那是什么
MySQL
类,是
getResult
异步的?如果它是异步的,它会返回什么?你能贴上它的签名吗?看看
消费者
方法
接受
的定义-它的返回类型是
void
。即使文档说“表示一个只接受一个输入参数而不返回结果的操作”,也只是一个消费者返回结果。您可能在方法声明中使用
谓词
,而不是
消费者
。请提供
MySQL.getResult
方法签名(即参数类型和返回类型)谢谢,我明白了:问题是,虽然这个答案在技术上是正确的,但它对OP没有帮助,因为这个问题提出得很糟糕,请参阅第二版。。。答案是asynchronousa使用者不会返回void。消费者返回一个值,你可以像我一样在可运行的任务中使用。@Tiombo 1)你不断破坏你的帖子对你和这里的任何人都没有帮助,所以请慢慢来,包括一些有用的信息。2) 看看函数描述符。@Tiombo使用者不返回任何东西,即它实际上返回void。在您的情况下,当响应可用时,使用者接受另一个线程推送的值。然后,在另一个线程中处理该响应,并将该响应作为argument@Tiombo奇怪的是,你不相信我们在这里说的话,也不阅读
消费者
类的Javadoc……但是好吧,如果你认为Java中的
消费者
返回一个值,那就足够公平了,祝你好运,啊,请把证明你的陈述正确的代码贴在这里作为答案。这就引出了另一个问题,如果
消费者
返回值,为什么要打开这个问题?
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()