Возвращение значения метода в выражении Consumer - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь вернуть логическое значение внутри метода, и я использую функцию потребителя.Есть ли способ вернуть это значение непосредственно в это выражение потребителя?

Вот код:

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 голосов
/ 07 декабря 2018

Ваш метод getResult объявлен как:

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

Где Consumer<ResultSet> - это функциональный интерфейс, представляющий функцию, принимающую ResultSet в качестве ввода и имеющую тип возврата void.

То, что вы ищете, называется предикатом, т.е. Predicate<ResultSet>

0 голосов
/ 07 декабря 2018

Нет, это невозможно.Лямбда-выражение является реализацией Consumer.accept и поэтому не может возвращать значение, потому что этот метод недействителен.

Я знаю, что могу создать логическое значение и изменить это значение, но я не хочу делатьэто.

Не совсем либо.В лямбда-выражении вы можете ссылаться только на локальные переменные, которые являются окончательными (что делает это по своей сути невозможным).Вам придется использовать другие методы (например, изменяемый эталонный объект), чтобы обойти это ограничение.

Подход, который можно предложить, - это использовать будущее здесь:

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

ЭтоВажно отметить, что это способ блокировать выполнение, предназначенное для асинхронного.

0 голосов
/ 07 декабря 2018

Это лямбда-выражение, которое выполняется после завершения метода 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Вы должны сделать другое лямбда-выражение:

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

Надеюсь, это поможет

...