2014-11-14 2 views
7

Я ищу способ сопоставить выделенную вкладку String с массивом. В настоящее время я делаю это с помощью выражения лямбда:Ссылка на метод с аргументом

stream.map(line -> line.split("\t")); 

Есть ли способ сделать это с помощью ссылки на метод? Я знаю, что stream.map(String::split("\t")) не работает, но мне интересно, есть ли альтернатива.

+0

Вы имеете в виду ссылку на существующий метод в JDK? Потому что вы можете легко сделать MyStringUtils :: splitByTab и ссылаться на это. – Thilo

+2

Я имею в виду в целом. I.e., всякий раз, когда метод имеет аргумент. – mossaab

+0

Ах, вы ищете Java-эквивалент курсовых методов или Javascript 'bind' (который может вводить параметры). +1 для этого. – Thilo

ответ

7

Вы можете сделать что-то вроде этого:

static<T,U,R> Function<T,R> curry(BiFunction<? super T, ? super U, ? extends R> f, U u) { 
    return t -> f.apply(t, u); 
} 

, и тогда вы будете в состоянии сделать:

stream.map(curry(String::split, "\t")); 
+3

Вы можете упростить подпись заменяя '? super U' с 'U', поскольку второй параметр' U u' будет принимать подтипы 'U' в любом случае (это отличается от' T' и 'R', поскольку эти два используются возвращаемым типом). – Holger

+6

Это работает, но это похоже на прогулку по зданию, чтобы идти по соседству; вы вводите новую абстракцию, чтобы вы могли использовать ссылку на метод. Код проще и проще, используя лямбда. –

+0

Независимо от того, что пытался сделать OP, следующее утверждение было бы более правдоподобным для того, что такое каррирование: 'public static Функция > curry (BiFunction bf) {return t -> u -> bf.apply (t, u);} '. – Jubobs