2016-11-07 2 views
9

Swiftでは、関数型は一流の市民として扱われ、他の型と同様にどこでも使用できます。その構文は簡単で、簡単に理解して使用することができます。Javaのラムダ式とSwiftの関数型の比較

一方、Javaではラムダ式による関数プログラミングがサポートされていますが、一般的にSwiftの関数型と比較して、直感的ではなく、理解しにくく、見た目が制限されています。

私の質問は、Swiftの関数型とJavaのラムダ式の目的は関数型プログラミングを達成することなので、Swiftの関数型でできることはありますか?Javaのラムダ式はできません。それとも両方とも同等に強力ですか?

+1

比較に[Kotlin](https://kotlinlang.org/)を追加することを検討してください。 – Vadzim

+1

Javaでのパフォーマンス/膨らみのヒットを考慮する必要があるもの:https://realm.io/news/360andev-jake-wharton-java-hidden-costs-android/基本的に、Swiftのクロージャと関数型の実装は、言語の核心である。 Javaの実装は、タックされています。 – PeejWeej

答えて

8

Javaのlambdas(実装)とSwiftのfunctional type(タイプ)を比較するのは間違いです。しかし、JavaのラムダとSwiftsのClosuresを比較することは可能です。 Swiftの機能型はJavaのfunctional interfacesです。

クロージャはラムダより強力です:

  1. (メジャー)クロージャは、電子、非定数の変数を取り込むことができます。グラム

    func makeIncrementer(forIncrement amount: Int) ->() -> Int { 
        var runningTotal = 0 
        return() -> Int { 
         runningTotal += amount 
         return runningTotal 
        } 
    } 
    
  2. (マイナー)クロージャは、例えば、速記引数名をサポート

    reversedNames = names.sorted(by: { $0 > $1 }) 
    
  3. (マイナー)後続クロージャのサポート。一方から

    someFunctionThatTakesAClosure() { 
        // trailing closure's body goes here 
    } 
    

、機能インタフェースは、機能の種類よりも強力です。追加のメソッドを宣言することができます。 reversedおよびthenComparingのような、比較器構築のための便利な方法の束を定義するjava.util.Comparatorである。

+0

おそらくハックですが、Javaで配列を使用してケース#1のように動作させることができます。つまり、 'final int [] runningValue = new int [] {0};' '' 'return ++ runningValue [0]; } '。 –

2

私は、Java機能APIで1つの制限について考えることができます。

ラムダ式をJavaで記述するには、1つのメソッドを持つインターフェースが必要です。 JDKにはすでにいくつかのインターフェースが用意されていますが、IMHOの名前はswiftの関数タイプよりも記述的ではありません。 Predicate<T>Tパラメータを受け付け、booleanを返すとすぐに推測することはできません。一方、T -> Boolははるかにクリーンで明確です。

私はそれ以外に、Javaのラムダ式は、すばやい関数型ができることは何でもできると思います。

0

私はJava開発者として、どちらも勉強しなければならないと思っていますが、その機能的なプログラミングはそのハードトピックを理解すると言うことができますが、今は多くの機能を理解しています。クロージャを使用するときにSWIFTのストリームを使用すると、関数インタフェースとlambdaを実装する方法を理解したら、ラムダ/ストリームの組み合わせで、より読みやすい方法で数行のコードで多くのことを行うことができます。オラクルはそれに多くの努力を払っていました。あなたがうまくいけば、より洗練されたコードを作ることができます。あなたの質問に答えるにはどちらも強力ですが、ラムダはもっと類似した速さのクロージャです。

関連する問題