2016-04-11 9 views
2
public static <T, U, R> Function<U, R> partial(BiFunction<T, U, R> f, T x) { 
     return (y) -> f.apply(x, y); 
    } 

В приведенном выше выражении, я могу понять, что функция частичных возвращает другую функцию, Function<U, R>. То, что Function<U, R> само по себе возвращает значение R. Что остальное static <T, U, R> означает? Я имею в виду, если Function<U, R> возвращает R, что является сделкой с <T, U, R>?Java 8 частичное применение функции/выделки

+2

Тип параметра. Читайте о дженериках в Java. – Tunaki

+0

Эти '' говорят Java, что 'T',' U' и 'R' не должны быть действительными классами, а заполнителями для общих классов. –

+0

Вот как вы определяете метод с параметрами типа. См. [Общие методы] (https://docs.oracle.com/javase/tutorial/extra/generics/methods.html) в учебных пособиях Oracle по Java. – Jesper

ответ

4

(Я знаю, что это не технически корректно в терминологии Java, но я хочу сказать «аргумент» ниже, где я имею в виду «формальный параметр», потому что смешивание «формального параметра» и «параметра типа» повсюду сбивает с толку.)

T - параметр типа для аргумента x.

partial принимает два аргумента:

  • f, функцию, которая принимает T и U и возвращает R:
    BiFunction<T, U, R> f

  • x, который имеет тип T:
    T x

partial возвращает новую функцию, которая принимает только U (не T и U) и возвращает R. Вместо того, чтобы ожидать аргумент T, новая функция использует x, предоставленную partial при вызове f.

Вкратце: Это возвращает новую функцию, в которой первый аргумент (типа T) был частично применен (кэрри) с помощью x аргумента partial «ы.

Причины мы <T, U, R> ближе к началу декларации является то, что, как синтаксис Java позволяет нам определить, что partial является универсальным методом, используя параметры типа T, U и R (в противном случае, они выглядят типа имен , а не параметров).

+0

, поэтому в «статическом » Т заменяется на «BiFunction f» и U = «T x "? – microwth

+1

@microwth: Нет, 'T',' U' и 'R' указаны при вызове метода, чтобы дать конкретные типы для этих параметров типа. То, что 'partial' делает, возвращает функцию, принимающую' U' и возвращающую 'R', которая вызывает исходную функцию, принимающую' T' и 'U', и возвращает' R' с указанным значением 'x'. Например, если у меня есть метод 'Widget foo (String, List)', я мог бы использовать 'partial' для получения' 'Widget partialFoo (List)', который будет вызывать 'foo' с' x' в качестве строки. Подробнее в учебнике generics: https://docs.oracle.com/javase/tutorial/extra/generics/methods.html –

+0

@ t-j-crowder, который вызывает оригинальную функцию «вы имеете в виду функцию« f »? Это похоже на «return (y) -> f.apply (x, y)»; «Функция », а затем, когда выполняется f.apply (x, y), она возвращает значение, поэтому оно становится значением return (y) ->, которое является функцией, которая удовлетворяет статическому . Это верно ? – microwth

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

  • Нет связанных вопросов^_^