我正在尝试在方法内部返回布尔值,而我正在使用使用者函数。 有什么办法可以直接在该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());
}
答案 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>