2015-09-09 3 views
8

Когда метод Java принимает Function<? super T, ? extends U>, тогда можно предоставить ссылки на методы в синтаксисе, как показано ниже: MyClass::myMethod.Цепные функции лямбда

Однако мне интересно, есть ли способ связать несколько вызовов методов. Вот пример, иллюстрирующий случай.

// on a specific object, without lambda 
myString.trim().toUpperCase() 

Мне интересно, есть ли синтаксис для перевода этого выражения на лямбда. Я надеюсь, что есть что-то вроде следующего:

// something like: (which doesn't work) 
String::trim::toUpperCase 

В качестве альтернативы, существует ли класс утилиты для объединения функций?

// example: (which does not exist) 
FunctionUtil.chain(String::trim, String::toUpperCase); 
+0

Как насчет ['Function.andThen'] (https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html#andThen-java.util.function.Function -)? –

+2

Каноническое решение заключается в _stop, используя метод reference_, и просто напишите 'myString -> myString.trim(). ToUpperCase()'. –

+0

@ LouisWasserman отличное обходное решение. Но я действительно надеялся на синтаксическую сладость. – bvdb

ответ

4

Java 8 Function s может быть прикован с помощью метода andThen:

UnaryOperator<String> trimFunction = String::trim; 
UnaryOperator<String> toUpperCaseFunction = String::toUpperCase; 
Stream.of(" a ", " b ").map(trimFunction.andThen(toUpperCaseFunction)) // Stream is now ["A", "B"] 

Обратите внимание, что в вашем конкретном примере, String::trim не компилируется, так как метод trim не принимает любой входной сигнал, так что он делает не соответствует функциональному интерфейсу Function (то же самое относится к String::toUpperCase).

+2

метод экземпляра с N args является видом функции с N + 1 args; дополнительный arg - это 'this'. Поэтому мы можем сделать 'UnaryOperator trimFunc = String :: trim' – ZhongYu

+1

@ bayou.io Я не знал, что вы можете это сделать. Я редактировал свой пост с вашим предложением. – Tunaki

+2

соответствует 'Function ' тоже ... – ZhongYu

Смежные вопросы