Передача универсальной функции ToIntFunction в метод в одну строку - PullRequest
0 голосов
/ 20 января 2019

Предположим, у меня есть несколько List различных объектов, и я хочу сопоставить эти объекты значению int (например, возвращая длину String), чтобы я мог выполнять операции в Stream , Поэтому я создаю метод, такой как:

public <T> int foo(List<T> list, ToIntFunction<T> toInt) {
     return list.stream().mapToInt(toInt).max().orElse(Integer.MIN_VALUE);
}

(Примечание: max может быть другой операцией терминала)

Тогда я хочу передать ему ToIntFunction. Я могу сделать:

ToIntFunction<String> length = e -> e.length();
int bar = foo(list, length);

Однако мне нужно было бы выписывать ToIntFunction каждый раз, когда я вызывал метод.

Есть ли способ просто сделать что-то вроде:

foo(list, new ToIntFunction<String>(e -> e.length()) );  
//Obviously ToIntFunction is an interface and can't be instantiated 

Или нужно сделать это в две строки с именованной переменной?

1 Ответ

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

Просто передайте его как встроенную лямбду, например,

foo(Arrays.asList("test"), e -> e.length());

Или вот более читабельный метод, основанный на ссылке на метод,

foo(Arrays.asList("test"), String::length);

Хитрость в том, что ToIntFunction<T> - это единственный интерфейс абстрактного метода, и язык позволяет создавать экземпляры этих интерфейсов с использованием лямбда-выражений.

Выше лямбда-выражения просто синтаксический сахар, который заменяет более многословный анонимный внутренний класс.Вот этот подход до Java8.

int bar = foo(Arrays.asList("test"), new ToIntFunction<String>() {
    @Override
    public int applyAsInt(String value) {
        return value.length();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...