戦わないで、KotlinがどのようにJavaを爆発させるかを見ます


前言:KotlinはグーグルのサポートとAndroidの開発の簡素化で有名だ.Javaの多くの痛みをどのように解決するかを見てみましょう.
Why Kotlin?
もし私が今日Androidアプリケーションの開発と他の分野の開発をどのように区別するかと聞かれたら、私はためらうことなく答えて、オリジナルの方法で異なるハードウェアで同じアプリケーションを実行するのが原因の一つかもしれません.しかし...それは不可能ですか?私はやはりKotlin言語のメリットを説明することで私のこの文章を始めましょう.
この点では、同じWebアプリケーションがどのデバイスでも実行されていることに驚く人はいません(Android、iOS、Windows、MacOS...).これらのアプリケーションは、ローカルアプリケーションよりも遅く、不安定であることはよく知られていますが、利点は、すべてのプラットフォームにアプリケーションを開発する必要があることです.Javaの強さは、Javaコンパイラが生成したpseudo-compiled解釈器がある限り、ハードウェアとソフトウェアにかかわらず、現在数十億のデバイスに適用されていることです.
しかし、これはJavaが完璧なソリューションであることを意味しますか?残念なことに、事実はそうではない.Javaはデバイス間の相互運用性の問題を解決しましたが、次のような新しい問題をもたらしました.
注意:これらの問題はJava 8と9で解決されたが、API 24以下のAndroid SDKでは利用できず、実際には使用できない.
optionalsではローカルサポートはありません.Optionalクラスがありますが、その使用は、拡張ではなく、オプションのサポートが言語自体で構築されている場合、これらのコードを保存することができる多くのテンプレートコードを生成することを意味します.
関数プログラミングについては、ローカルのサポートはありません.JavaにはStream APIがあります(もう一度言えば、API 24から始まるAndroidのみをサポートします).しかし、言語の統合はOptionalに似ています.元のタイプに関連付けられたオブジェクト(IntStream,DoubleStream...)には存在せず、1つのStream classで他のすべてのオブジェクトに提供されます.
匿名関数(Lambdas)をサポートします.Java 8にはLambda関数のサポートが含まれていますが、これらは1級公民ではありません.これは、lambdasを使用して匿名インタフェースを単一の方法で実装できるにもかかわらず、Javaは関数をパラメータとしてメソッドに渡すことをサポートしていないことを意味します.さらに、Lambdasの文は、言語でのサポートが不足しているため、特に関数の組合せやローカル・スイートなどの関数のシミュレーションを試みた場合に非常に不快である.
Type nullability:これはオプションの部分に含めることができますが、この問題の次元は特に言及する必要があります.どのくらいのJavaプログラマーがif(foo!=Null)を通じて恐ろしいNull PointerExceptionと戦い、コードを埋め尽くさなかったのだろうか.(実際には、その作成者は彼が言った「10億ドルのエラー」に謝罪しなければならない)、これらのチェックには、私たちのアプリケーションでクラッシュを避けるためのパッチがどれだけあるのでしょうか.
Binding of manual views:この問題はJavaではなくAndroidプラットフォーム向けですが、Androidビューへの参照を得るためにテンプレートコードも必要です.我々はdataBindingによって不人気なfindViewById(int id)を排除することに成功したが、バインドへの参照を格納する必要がある.
なぜKotlinはそれを破ったの?
Javaは非常に冗長な言語で、任意の操作のために大量のコードを作成し、大量のファイル(クラスごとに1つ)を生成する必要があります.最初の問題は、コードのメンテナンスコストが高くなり、エラーが発生しやすくなる可能性があります.2つ目の問題はclass proliferation問題です.
そのため、今日、Javaは少なくともAndroid開発において、業界のスピードで発展していないと考えられています.時間が経つにつれて、上記のすべての問題を解決するために現実的でオリジナルのサポート言語が必要になります.この言語は、本明細書で最初に述べた主な特徴を同時に持つ必要があります.アプリケーションを作成し、コンパイルし、任意のデバイスとバージョンで実行できるようにする必要があります.
この方向では,いくつかの可能性が探索されているが,そのうちのいくつかはSwiftまたはScalaを用いているが,いずれも非常に有望ではない.これらはすべてKotlin言語の出現によって変化した.KotlinはJetbrainsによって設計され開発された言語で、この言語はまだ絶えず進化しており、最も重要なのはJVM上で実行できることです.これはAndroidアプリケーションの完璧な候補者になります.
これを証明するために、Javaのすべての欠点に直面したとき、Kotlinが示した優位性をリストすることができます.
Optionals:彼らはKotlinに構築されています.変数のタイプを疑問符で終わるように宣言することで、optionalのタイプになります.Kotlinはまた、optionals listenerを安全に開くことができますか?のonSuccess()の可能性は、optionalに値があるかどうかをチェックする必要がなく、Elvis Operatorも提供されています.
関数プログラミング:Kotlinでは、Streamsのような集合とデータセットを処理するためのローカルサポートを見つけました.collectionで直接呼び出すことができます.flatMap{}または.filter {}、.map{}など.タイプの推定はLambdasの使用を特に容易にした.
Lambdasと高次関数:Kotlinでは関数が1級公民であるという事実が完成した.パラメータとして他の関数を受信する関数を定義できます.1つの例はmap関数自体の定義です.
一見、このコードは少し混乱しているように見えますが、私たちが興味を持っている部分はtransform:(T)->Rです.これはmap関数にパラメータtransformがあることを意味し、それ自体が関数であり、Tタイプの入力パラメータがあり、オブジェクトタイプのRを返す.
Lambdasのローカルサポートのため、Kotlinではmap関数を使用できます.
inline fun  Iterable.map(transform: (T) -> R): List (source)

このコードクリップは、aTransformationによって生成された戻りタイプの要素のセットを返します.
collection.map { item -> aTransformation(item) }

Type nullability:Kotlinではoptionalsの統合サポートがあるため、私たちのコードにはnullablesが最小化されるべきです.それでもKotlinはJavaよりも扱いやすいツールを提供しています.例えばsafe call(?)NullPointerExceptionを回避したり、変換を実行したいときにオペレータの安全なcastを使用して保護したりします.また、Kotlinのコンパイラは、Javaコードと互換性のある実行時チェックを導入する場合でも、空の値を持つタイプを強制的に制御します.
Binding of views:これは具体的なAndroid問題で、Jetbrainsは私たちにKotlin Android拡張を提供してくれました.公式のサポートライブラリはgradleのプラグインによってこの問題(および他の問題)を簡略化します.
Java:
public interface Listener {
  void success(int result);
  void error(Exception ex);
}
public void someMethod(Listener listener) {
  int rand = new Random().nextInt();
  if(listener != null) {
    if (rand <= 0) {
      listener.onError(new ValueNotSupportedException());
    }
    else {
      listener.success(rand);
    }
  }
  public void fun(Type1 param1) {
    param1.someMethod(new Listener() {
      @Override
      public void success(int result) {
        println(“Success” + result);
      }
      @Override
      public void error(Exception ex) {
        ex.printStackTrace();
      }
    }
}

Kotlin:
fun someMethod(success: (Int) -> Unit, error: (Exception) -> Unit) { val rand = Random().nextInt() if (rand <= 0) { error(ValueNotSupportedException()) else { success(rand) } } } fun (param1: Type1) { param1.someMethod( { println(“Success” + it); }, { it.printStackTrace(); }) } 

式を使用することもできます.
fun someMethod(success: (Int) -> Unit, error: (Exception) -> Unit) { val rand = Random().nextInt() if (rand <= 0) error(ValueNotSupportedException()) else success(rand) } fun (param1: Type1) { param1.someMethod( { println(“Success” + it); }, { it.printStackTrace(); }) }

今、読者はどの断片が書きやすく解釈しやすいかをよく知っているはずだ.
以上,我々が議論した多くの他の機能は,Kotlinが今後数年でモバイル開発分野で最も有望な勝者であることを絶えず証明している.
原文リンク:Why Kotlin Language,Android?Why Did Google Choose Kotlin?(責任編/魏偉)