Как передать ссылку на метод в Triple? - PullRequest
0 голосов
/ 10 января 2019

У меня есть список троек, например,

import org.apache.commons.lang3.tuple.ImmutableTriple;

final HashMap<String, ImmutableTriple<String, String, Function<String, String>>> olMap = new HashMap();

и я хочу добавить что-то вроде

olMap.put("start", new ImmutableTriple("str1", "str2", MyClass::minusOne));

Я получаю следующую ошибку:

The constructor ImmutableTriple(String, String, MyClass::minusOne) is undefined

что составляет

private static String minusOne(String count) {
    String ret = count;
    if (count != null) {
        try {
            ret = (Integer.parseInt(count) - 1) + "";
        } catch (final Exception e) {
            // nothing to do cuz input wasn't a number...
        }
    }
    return ret;
}

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

ol.get("start").right.apply("100")

UPDATE:

Я нашел правильный синтаксис:

final HashMap<String, Triple<String, String, Function<String, String>>> olMap = new HashMap();
olMap.put("start", new Triple.of("str1", "str2", MyClass::minusOne));

Спасибо за помощь и заверение - иначе я бы ее не нашел

1 Ответ

0 голосов
/ 10 января 2019

new Triple.of(...) может быть правильным синтаксисом Java.

Вы пытались передать MyClass::minusOne как Object и, поскольку это не функциональный интерфейс, вы получили ошибку компиляции.

Убедитесь, что у вас нет необработанных типов:

ImmutableTriple t = new ImmutableTriple("str1", "str2", MyClass::minusOne);
HashMap m = new HashMap();

Правильные параметры будут указывать полный список параметров типа:

Triple<String, String, Function<String, String>> t1 = 
    Triple.<String, String, Function<String, String>>of("str1", "str2", MyClass::minusOne);
Triple<String, String, Function<String, String>> t2 = 
    new ImmutableTriple<String, String, Function<String, String>>("str1", "str2", MyClass::minusOne);

или использование <> для автоматического разрешения:

Triple<String, String, Function<String, String>> t1 = 
    Triple.of("str1", "str2", MyClass::minusOne);
Triple<String, String, Function<String, String>> t2 = 
    new ImmutableTriple<>("str1", "str2", MyClass::minusOne);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...