2016-06-23 15 views
4

Functional Programming in Javaの書籍では、著者はFunction<T, U>インターフェイスのみを使用して作成機能を作成します(インターフェイスはJava 8には含まれていませんが非常に似ています)。java 8で機能<>を使用して作成を実装する

public interface Function<T, U> { 
    U apply(T arg); 
} 

の下に、私は2つの機能を取り込み、下記コンの方法バージョンを、理解し、

public static final Function<Integer, Integer> compose (final Function<Integer, Integer> f1, 
            final Function<Integer, Integer> f2) { 
     arg -> f1.apply(f2.apply(arg)); 
} 

は、私はちょうどのまわりで私の頭を取得できませんでした以下のimplementatiを構成する構成機能を返すことができても機能<と上>とラムダ

static Function<Function<Integer, Integer>, 
      Function<Function<Integer, Integer>, 
        Function<Integer, Integer>>> compose = 
      x -> y -> z -> x.apply(y.apply(z)); 

PS:このうち私の心を取得し、残りのセクションを進めることができませんでした:(

+1

http://stackoverflow.com/questions/19834611/how-to-do-function- composition maybe –

+0

私は与えられた関数で2つのfxnを作成する方法を見ていますが、その作成関数を実装する方法についての懸念がありました。 –

+1

http://stackoverflow.com/questions/32820722/what-does-lambda-with-2arrows- mean-in-java-8/32820940 –

答えて

6

は、あなたがそこに持っているもの、整数関数としてFunction<Integer, Integer>を参照すると、 {整数関数}を{整数関数を別の整数関数に写像する関数}にマップする関数です。

具体的には、整数関数xが与えられたとき、それは、整数関数y所与、x(y(z))の整数をzをマッピング整数関数を返す関数を返します。

Given a function x 
Returns a function that: 
    Given a function y 
    Returns a function that: 
     Given an integer z 
     Returns x(y(z)) 
3

私はλx.Eが引数xをとり、Eの値を返す関数を意味タイプを、省略するシンプルなλ-表記を使用してみましょう。たとえば、λx. λy. x+yは、xを受け取り、λy. x+yを返す関数です。それ自体はyをとり、x+yを返す関数です。また、の2つのの引数xyを取り、Eという値を返す関数に対しては、λ(x,y).Eと書いてみましょう。たとえば、λ(x,y). x+yは、とyを一度に受け取り、を返し、x+yを返す関数です。

composeのその後「二つの引数を一度に」バージョンは次のとおりです。λ(f,g). λx.f(g(x))

秒、「1対1」のバージョンは次のとおりです。Javaコードで怖いに見える他のλf. λg. λx.f(g(x))

すべてがあります注釈を入力するだけです。 fg(およびcomposeの結果)の両方がタイプFunction < Integer, Integer >です。このタイプはTとしましょう。次に、作成の第2バージョンはタイプFunction < T, Function < T, T > >です。

P.S. λx. λy. Eのような機能はと呼ばれ、λ(x,y). Eであり、です。参照:https://en.wikipedia.org/wiki/Currying

0

このタイプのイラストレーションは、さまざまなタイプやジェネリックを使用すると意味があります。

Function<Function<R, S>, 
     Function<Function<T, R>, 
        Function<T, S>>> compose = x -> y -> z -> x.apply(y.apply(z)); 

編集:タイプが誤って配置した(彼らは異なっているとき、それはより良い運動だ理由です)