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()