Javaを超えるKotlinの登場は間違いなく存在する

Kotlinの登場は間違いなくJavaを超える存在です。Google I/O 2017でGoogleはKotlinがAndroidの正式開発言語になったと発表しましたが、その背景にはOracleがJavaの使用を侵害しているとしてGoogleを訴えたことがあります。周知のとおり、Java のクロスプラットフォーム開発言語は仮想マシンの恩恵を受けています。私は Android、IOS、データ サイエンス研究 (機械学習カテゴリ) 用の Kotlin にもっと関心があります。

目次

Kotlin マルチプラットフォーム

Kotlin マルチプラットフォームの使用シナリオ

Android および iOS アプリ

フルスタック Web アプリケーション

マルチプラットフォームライブラリ

モバイルアプリケーションとWebアプリケーションの共通コード

Kotlin マルチプラットフォームの仕組み

異なるプラットフォーム間でコードを共有する

はじめる

サンプルプロジェクト

サーバーサイド開発用の Kotlin

Kotlinを使用したサーバーサイド開発のフレームワーク

Kotlin サーバー側アプリケーションをデプロイする

サーバーサイド製品用の Kotlin

Android 開発用の Kotlin

JavaScript 開発用の Kotlin

Kotlin/JS IR コンパイラー

Kotlin/JS の使用シナリオ

Kotlin ネイティブ

Kotlin/ネイティブを選択する理由

ターゲットプラットフォーム

相互運用性

複数のプラットフォーム間でコードを共有する

どうやって始めるのか

チュートリアルとドキュメント

データ サイエンスのための Kotlin

インタラクティブエディタ

Jupyter Kotlin カーネル

Datalore の Kotlin ノートブック

Zeppelin Kotlin インタープリター

クラスライブラリ

Kotlin ライブラリ

Javaライブラリ

競技プログラミングのための Kotlin

簡単な例: 到達可能性の問題

関数操作の例: 長い数の問題

その他のヒントとコツ

Kotlin を学ぶ


Kotlin マルチプラットフォーム

Kotlin マルチプラットフォームはベータ段階ですほぼ安定していますが、将来的には移行手順が必要になる可能性があります。開発者が必要とする変更を最小限に抑えるために最善を尽くします。

Kotlin マルチプラットフォームの使用シナリオ

Android および iOS アプリ

モバイル プラットフォーム間でのコードの共有は、Kotlin マルチプラットフォームの主な使用例の 1 つです。Kotlin マルチプラットフォーム モバイルを使用すると、クロスプラットフォーム モバイル アプリケーションを構築し、ビジネス ロジックや接続などの共通コードを Android と iOS 間で共有できます。

Kotlin マルチプラットフォーム モバイルの開始方法と、 Ktor と SQLDelight を使用したマルチプラットフォーム アプリの作成チュートリアルを確認してください。このチュートリアルでは、2 つのプラットフォーム間でコードを共有するモジュールを使用して Android アプリと iOS アプリを作成します。

フルスタック Web アプリケーション

コード共有がメリットをもたらすもう 1 つのシナリオは、サーバー側とブラウザーで実行されるクライアント側の両方でロジックを再利用できる接続アプリケーションです。これは Kotlin マルチプラットフォームでもカバーされています。

Kotlin マルチプラットフォームを使用したフルスタック Web アプリの構築チュートリアルを参照してください。このチュートリアルでは、Kotlin/JVM を使用したサーバー部分と Kotlin/JS を使用した Web クライアントで構成される接続アプリケーションを作成します。

マルチプラットフォームライブラリ

Kotlin マルチプラットフォームは、ライブラリ作成者にとっても役立ちます。共通のコードと、JVM、JS、およびネイティブ プラットフォーム用のプラットフォーム固有の実装を含むマルチプラットフォーム ライブラリを作成できます。マルチプラットフォーム ライブラリは、公開されると、他のクロスプラットフォーム プロジェクトで依存関係として使用できます。

「マルチプラットフォーム ライブラリの作成と公開」チュートリアルを参照してください。このチュートリアルでは、マルチプラットフォーム ライブラリを作成し、テストして、Maven に公開します。

モバイルアプリケーションとWebアプリケーションの共通コード

Kotlin マルチプラットフォームを使用するもう 1 つの一般的なケースは、Android、iOS、Web アプリ間で同じコードを共有することです。これにより、フロントエンド開発者がコーディングするビジネス ロジックの量が削減され、製品の実装がより効率的になり、コーディングとテストの労力が軽減されます。

RSS リーダーのサンプル プロジェクトを参照してください。これは、デスクトップおよび Web クライアントが実験的な機能として実装された、i​​OS および Android 用のクロスプラットフォーム アプリケーションです。

Kotlin マルチプラットフォームの仕組み

 

  • パブリック Kotlin には、言語、コア ライブラリ、および基本ツールが含まれています。共通の Kotlin で書かれたコードは、すべてのプラットフォームのどこでも機能します。
  • Kotlin マルチプラットフォーム ライブラリを使用すると、マルチプラットフォーム ロジックを共通コードだけでなくプラットフォーム依存のコードでも再利用できます。一般的なコードは、 HTTPシリアル化、コルーチンの管理などの日常的なタスクをカバーする一連のライブラリに依存できます
  • プラットフォームの相互運用性を確保するには、プラットフォーム固有のバージョンの Kotlin を使用してください。Kotlin のプラットフォーム固有のバージョン(Kotlin/JVM、Kotlin/JS、Kotlin/Native) には、Kotlin 言語の拡張機能とプラットフォーム固有のライブラリおよびツールが含まれています。
  • これらのプラットフォームは、プラットフォーム ネイティブ コード(JVM、JS、およびネイティブ)へのアクセスを提供し、すべてのネイティブ機能を活用します。

異なるプラットフォーム間でコードを共有する

Kotlin マルチプラットフォームを使用すると、異なるプラットフォームで同じコードを作成して保守する時間を短縮できます。Kotlin が提供するメカニズムを使用してコードを共有するだけです。

はじめる

Kotlin は初めてですか? 「Kotlin の概要」を参照してください

サンプルプロジェクト

サンプルのクロスプラットフォーム アプリケーションを調べて、Kotlin マルチプラットフォームがどのように機能するかを確認します。

サーバーサイド開発用の Kotlin

Kotlin はサーバーサイド アプリケーションの開発に最適です。これにより、既存の Java ベースのテクノロジ スタックとの完全な互換性とスムーズな学習曲線を維持しながら、簡潔で表現力豊かなコードを作成できます。

  • 表現力:タイプセーフ ビルダー委任されたプロパティのサポートなど、Kotlin の革新的な言語機能は、強力で使いやすい抽象化の構築に役立ちます。
  • スケーラビリティ: Kotlin のコルーチンのサポートは、多数のクライアントを処理するための適度なハードウェア要件に合わせて拡張するサーバー側アプリケーションの構築に役立ちます。
  • 相互運用性: Kotlin はすべての Java ベースのフレームワークと完全な互換性があるため、使い慣れた技術スタックを使用しながら、より最新の言語のメリットを得ることができます。
  • 移行: Kotlin は、Java から Kotlin への大規模なコードベースの段階的な移行をサポートしています。システムの古い部分は Java のままでありながら、Kotlin で新しいコードの作成を開始できます。
  • ツール: 優れた IDE サポートに加えて、Kotlin は IntelliJ IDEA Ultimate のプラグイン用のフレームワーク固有のツール (Spring など) も提供します。
  • 学習曲線: Java 開発者にとって、Kotlin を使い始めるのは簡単です。Kotlin プラグインに含まれる自動 Java から Kotlin コンバーターは、その最初のステップに役立ちます。Kotlin Heartprint は、一連のインタラクティブな演習を通じて、言語の主な機能についてのガイドを提供します。

Kotlinを使用したサーバーサイド開発のフレームワーク

  • Spring は、 Kotlin の言語機能を活用して、バージョン 5.0 以降、よりクリーンな APIを提供します。オンライン プロジェクト ジェネレーターを使用すると、 Kotlin で新しいプロジェクトをすばやく生成できます。

  • Vert.x は、JVM 上でリアクティブ Web アプリケーションを構築するためのフレームワークであり、完全なドキュメントを含むKotlin の専用サポートを備えています。

  • Ktorは、Kotlin で Web アプリケーションを作成するために JetBrains によって構築されたフレームワークで、コルーチンを利用して高いスケーラビリティを実現し、使いやすく慣用的な API を提供します。

  • kotlinx.htmlは、Web アプリケーションで HTML を構築するために使用できる DSL です。JSP や FreeMarker などの従来のテンプレート システムの代替として使用できます。

  • Micronaut は、モジュール式で簡単にテストできるマイクロサービスとサーバーレス アプリケーションを構築するための、最新の JVM ベースのフルスタック フレームワークです。多くの便利な組み込み機能が付属しています。

  • http4k は、純粋な Kotlin で記述された、フットプリントが小さい Kotlin HTTP アプリケーション用の機能的なツールキットです。このライブラリは Twitter の論文「Your Server as a Function」に基づいており、HTTP サーバーとクライアントの両方を構成可能な単純な Kotlin 関数としてモデル化します。

  • Javalin は、Kotlin および Java 用の非常に軽量な Web フレームワークであり、WebSocket、HTTP2、および非同期リクエストをサポートします。

  • 対応する Java ドライバーを介した永続化に使用できるオプションには、直接 JDBC アクセス、JPA、NoSQL データベースの使用などがあります。JPA の場合、kotlin-jpa コンパイラー プラグインは、 Kotlin でコンパイルされたクラスをフレームワークの要件に適合させます。

Kotlin サーバー側アプリケーションをデプロイする

Kotlin アプリケーションは、Amazon Web Services、Google Cloud Platform など、Java Web アプリケーションをサポートする任意のホストにデプロイできます。

Kotlin アプリケーションをHerokuにデプロイするには、公式の Heroku チュートリアルに従ってください。

AWS Labs は、AWS Lambda関数を作成するための Kotlin の使用方法を示すサンプル プロジェクトを提供します。

Google Cloud Platform (Google Cloud Platform) は、Ktor と App Engineアプリケーション、Spring と App Engineアプリケーションなどの Kotlin アプリケーションを GCP にデプロイするための一連のチュートリアルを提供します。さらに、Kotlin Spring アプリケーションをデプロイするためのインタラクティブなコード ラボもあります

サーバーサイド製品用の Kotlin

Corda は、大手銀行によって提供され、すべて Kotlin で構築されたオープンソースの分散台帳プラットフォームです。

JetBrains Accounts は、JetBrains のライセンス販売および検証プロセス全体を担当するシステムで、100% Kotlin で書かれており、2015 年以来大きな問題なく運用環境で実行されています。

Android 開発用の Kotlin

Google I/O 2019 以来、Kotlin は Android モバイル開発の有力な選択肢となっています。

Android 開発に Kotlin を使用すると、次のようなメリットがあります。

  • コードが少なくなり、読みやすくなります他の人のコードを理解するよりも、コードを書くことに費やす時間を短縮します。
  • 成熟した言語と環境2011 年の創設以来、Kotlin は言語だけでなく強力なツールを通じてエコシステム全体で成長してきました。現在、Android Studio にシームレスに統合されており、多くの企業が Android アプリケーションを開発するために積極的に使用しています。
  • Android Jetpack およびその他のライブラリでの Kotlin のサポートKTX 拡張機能は、コルーチン、拡張関数、ラムダ、名前付きパラメーターなどの Kotlin 言語機能を既存の Android ライブラリに追加します。
  • Java との相互運用性すべてのコードを Kotlin に移行しなくても、アプリケーションで Java プログラミング言語で Kotlin を使用できます。
  • マルチプラットフォーム開発をサポートしますKotlin を使用して Android を開発できるだけでなく、 iOS 、バックエンド、Web アプリケーションも開発できますプラットフォーム間で共通コードを共有するメリットを享受してください。
  • コードのセキュリティコードが減り、読みやすさが向上すると、バグが減ります。Kotlin コンパイラーはこれらの残りのエラーを検出し、コードを安全にします。
  • 学習も使用も簡単ですKotlin は、特に Java 開発者にとって、学習が非常に簡単です。
  • 素晴らしいコミュニティKotlin は、世界中で成長しているコミュニティからの多大なサポートと多くの貢献を受けています。Google によると、Play ストアの上位 1000 アプリの 60% 以上が Kotlin を使用しています。

多くの新興企業やフォーチュン 500 企業が Android アプリケーションの開発に Kotlin を使用しています。詳細については、 Kotlin 開発者向けの Google サイトを参照してください。

Android 開発に Kotlin の使用を開始する場合は、「Android 開発の Kotlin入門」を参照してください。

Android を初めて使用する場合で、Kotlin でアプリを作成する方法を学びたい場合は、この Udacity コースを確認してください。

JavaScript 開発用の Kotlin

Kotlin/JS は、Kotlin コード、Kotlin 標準ライブラリ、および JavaScript と互換性のある依存関係を変換する機能を提供します。Kotlin/JS の現在の実装はES5 をターゲットとしています。

Kotlin/JS を使用する推奨される方法は、Gradle プラグインを使用することkotlin.jsですkotlin.multiplatformこれらは、JavaScript を対象とする Kotlin プロジェクトをセットアップおよび制御するための一元的かつ便利な方法を提供します。これには、アプリケーションのバンドルの制御、npm から直接 JavaScript の依存関係を追加するなどの基本的な機能が含まれます。利用可能なオプションの概要については、Kotlin/JS プロジェクトの構築ドキュメントを参照してください。

Kotlin/JS IR コンパイラー

Kotlin/JS IR コンパイラーには、古いデフォルトのコンパイラーに比べて多くの改良が加えられています。たとえば、デッドコードを削除することで結果として得られる実行可能ファイルのサイズを削減し、JavaScript エコシステムおよびそのツールとのよりスムーズな相互運用性を提供します。

古いコンパイラは、Kotlin バージョン 1.8.0 以降非推奨になりました。

d.tsIR コンパイラーは、Kotlin コードから TypeScript 宣言ファイル ( ) を生成することで、TypeScript と Kotlin コードを混合し、Kotlin のマルチプラットフォーム コード共有機能を活用する「ハイブリッド」アプリケーションの作成を容易にします

Kotlin/JS IR コンパイラーで利用可能な機能の詳細と、プロジェクトでそれを試す方法については、Kotlin/JS IR コンパイラーのドキュメント ページとその移行ガイドを参照してください。

Kotlin/JS の使用シナリオ

Kotlin/JS を使用するにはさまざまな方法があります。以下は、Kotlin/JS を使用できるシナリオの完全なリストではありません。

  • Kotlin/JS を使用して Web フロントエンド アプリケーションを作成する

    • Kotlin/JS を使用すると、強力なブラウザーと Web API をタイプセーフな方法で活用できますドキュメント オブジェクト モデル (DOM) 内の要素を作成、変更、操作し、Kotlin コードを使用してcanvasWebGL コンポーネントのレンダリングを制御し、最新のブラウザーでサポートされているさらに多くの機能へのアクセスを楽しみます。
    • JetBrains が提供するkotlin-wrappers を使用して、完全でタイプセーフな React アプリケーションを Kotlin/JS で作成します。JetBrains は、React やその他の一般的な JavaScript フレームワークに便利な抽象化と緊密な統合を提供します。kotlin-wrappers多くの同様のテクノロジー ( や など) のサポートも提供されてreact-reduxreact-routerますstyled-componentsJavaScript エコシステムとの相互運用性は、サードパーティの React コンポーネントおよびコンポーネント ライブラリを使用できることを意味します。
    • Kotlin/JS フレームワークを使用して、Kotlin 関連の概念とその表現力とシンプルさを活用します ( kvisionfritz2など)。
  • Kotlin/JS を使用してサーバーサイドおよびサーバーレス アプリケーションを作成する

    • Kotlin/JS は、サーバー上で実行されるアプリケーション、またはサーバーレス インフラストラクチャ上で実行されるアプリケーションを作成するための Node.js ターゲットを提供します。起動の高速化メモリ使用量の削減など、JavaScript ランタイムで実行する利点をすべて享受できますkotlinx-nodejsを使用すると、 Kotlin コードから直接Node.js APIにタイプセーフにアクセスできます。
  • Kotlin を使用して他の Kotlin ターゲットとコードを共有するマルチプラットフォームプロジェクト

    • multiplatformマルチプラットフォーム Gradle プラグインを使用する場合も、すべての Kotlin/JS 機能にアクセスできます。
    • Kotlin で書かれたバックエンドがある場合は、データ モデルやロジック検証などの共通コードをKotlin/JS で書かれたフロントエンドと共有できるためフルスタック Web アプリケーションを作成して保守できるようになります。
    • また、Web インターフェイスとモバイル アプリ(Android および iOS) の間でビジネス ロジックを共有し、REST API エンドポイント、ユーザー認証、ドメイン モデルに関する抽象化の提供などの共通機能の重複を避けることもできます
  • JavaScript と TypeScript のライブラリを作成する

    • また、アプリケーション全体を Kotlin/JS で記述する必要はありません。代わりに、使用されている他のフレームワークやテクノロジに関係なく、JavaScript または TypeScript で記述されたコードベースのモジュールとして使用できるライブラリをKotlin コードから生成できます。ハイブリッド アプリケーションを作成するこのアプローチでは、個人やチームが Web 開発ですでに持っている機能を活用しながら、重複した作業を減らし、Web ターゲットをアプリケーションの他のターゲット プラットフォームと調整することが容易になります。

もちろん、これは Kotlin/JS を最大限に活用する方法の完全なリストではなく、使用シナリオの一部にすぎません。さまざまな組み合わせを試して、プロジェクトに最適なものを見つけてください。

特定のユースケースに関係なく、Kotlin/JS プロジェクトは、 Kotlin エコシステムの互換性のあるライブラリだけでなく、 JavaScript および TypeScript エコシステムのサードパーティライブラリも使用できますKotlin コードで後者を使用する場合は、独自のタイプセーフ ラッパーを提供するか、コミュニティが管理するラッパーを使用するか、Dukat にKotlin 宣言を自動的に生成させることができます。Kotlin/JS 固有の動的型付けを使用すると、型安全性は犠牲になりますが、Kotlin の型システムの制約を緩和し、詳細なライブラリ ラッパーの作成をスキップできます。

Kotlin/JS は、最も一般的なモジュール システムである UMD、CommonJS、AMD とも互換性があります。モジュールを生成および使用できるということは、構造化された方法で JavaScript エコシステムと対話できることを意味します。

Kotlin ネイティブ

Kotlin/Native は、Kotlin コードを仮想マシンなしで実行できるネイティブ バイナリにコンパイルする手法です。Kotlin/Native には、LLVMベースのKotlin コンパイラー バックエンドと Kotlin 標準ライブラリのネイティブ実装が含まれています。

Kotlin/ネイティブを選択する理由

Kotlin/Native の主な設計目標は、仮想マシンの使用が望ましくない、または不可能なプラットフォーム (組み込みデバイスや iOS など) でKotlin をコンパイルできるようにすることです。これは、開発者が追加のランタイムや仮想マシンを必要としない自己完結型プログラムを作成する必要がある状況に最適です。

ターゲットプラットフォーム

Kotlin/Native は次のプラットフォームをサポートしています。

  • マックOS
    • iOS、tvOS、watchOS
  • Linux
    • Windows (MinGW)
  • アンドロイドNDK

Apple ターゲット プラットフォーム macOS、iOS、tvOS、watchOS をコンパイルするには、 Xcodeとそのコマンドライン ツールをインストールする必要があります。

サポートされているターゲットの完全なリストを参照してください

相互運用性

Kotlin/Native は、異なるオペレーティング システムのネイティブ プログラミング言語との双方向の相互運用性をサポートします。コンパイラは以下を作成できます。

Kotlin/Native で次の既存のライブラリを直接使用する相互運用がサポートされています。

コンパイルされた Kotlin コードを、C、C++、Swift、Objective-C、その他の言語で書かれた既存のプロジェクトに簡単に組み込むことができます。また、既存のネイティブ コード、静的または動的C ライブラリ、Swift/Objective-Cフレームワーク、グラフィックス エンジン、その他のネイティブ コンテンツをKotlin/Native で直接使用することも簡単です。

Kotlin/ネイティブライブラリは、複数のプロジェクト間で Kotlin コードを共有するのに役立ちます。POSIX、gzip、OpenGL、Metal、Foundation、その他多くの一般的なライブラリと Apple フレームワークがプリインポートされ、Kotlin/ネイティブ ライブラリとしてコンパイラ バンドルに含まれています。

複数のプラットフォーム間でコードを共有する

マルチプラットフォーム プロジェクトでは、 Android、iOS、JVM、JavaScript、ネイティブなどの複数のプラットフォーム間で共通の Kotlin コードを共有できます。マルチプラットフォーム ライブラリは、一般的な Kotlin コードに必要な API を提供し、Kotlin でプロジェクトの共有部分を 1 か所で開発し、一部またはすべてのターゲット プラットフォームと共有するのに役立ちます。

Kotlin モバイル マルチプラットフォームを使用すると、Android と iOS の間でコードを共有することにより、マルチプラットフォーム モバイル アプリケーションを作成できます。

どうやって始めるのか

チュートリアルとドキュメント

Kotlin は初めてですか? 「Kotlin 入門」ページをご覧ください

推奨ドキュメント:

推奨されるチュートリアル:

データ サイエンスのための Kotlin

データ パイプラインの構築から機械学習モデルの作成まで、Kotlin はデータを扱うための優れた選択肢となります。

  • Kotlin は簡潔で読みやすく、学習が簡単です。
  • 静的型付けと null 安全性は、信頼性が高く、保守しやすく、トラブルシューティングが簡単なコードを作成するのに役立ちます。
  • JVM 言語として、Kotlin は優れたパフォーマンスと、実証済みの Java ライブラリのエコシステム全体を活用する機能を提供します。

インタラクティブエディタ

Jupyter NotebookDataloreApache Zeppelinなどのノートブックは、データの視覚化や探索的研究に便利なツールを提供します。Kotlin はこれらのツールと統合して、データの探索、同僚との結果の共有、データ サイエンスと機械学習のスキルの構築に役立ちます。

Jupyter Kotlin カーネル

Jupyter Notebook は、コード、ビジュアライゼーション、Markdown テキストを含むドキュメント (「ノートブック」とも呼ばれる) の作成と共有を可能にするオープン ソース Web アプリケーションです。Kotlin-jupyter は、Kotlin サポートを Jupyter Notebook に提供するオープンソース プロジェクトです。

インストール手順、ドキュメント、例については、Kotlin カーネルのGitHub リポジトリを確認してください。

Datalore の Kotlin ノートブック

Datalore を使用すると、インストール不要で、すぐにブラウザーで Kotlin を使用できます。また、Kotlin ノートブックでリアルタイムで共同作業したり、コードを記述するときにスマートなコーディング支援を受けたり、結果をインタラクティブまたは静的レポートとして共有したりすることもできます。サンプルレポートを確認してください

無料の Datalore コミュニティ アカウントでサインアップして Kotlin を使用します

Zeppelin Kotlin インタープリター

Apache Zeppelin は、インタラクティブなデータ分析のための人気のある Web ベースのソリューションです。これは、データ エンジニアリングに特に役立つ Apache Spark クラスター コンピューティング システムの強力なサポートを提供します。バージョン 0.9.0以降、Apache Zeppelin には Kotlin インタープリターが組み込まれています。

クラスライブラリ

Kotlin コミュニティによって作成されたデータ関連タスク用のライブラリのエコシステムは急速に拡大しています。役に立つと思われるライブラリをいくつか示します。

Kotlin ライブラリ

  • Multik : Kotlin の多次元配列。このライブラリは、多次元配列に対する数学的演算のための、Kotlin 慣用的で型および次元が安全な API を提供します。Multik は、交換可能な JVM とネイティブ計算エンジン、および最適なパフォーマンスを実現する 2 つの組み合わせを提供します。

  • KotlinDL は、 Kotlin で記述され、Keras からインスピレーションを得た高レベルの深層学習 API です。深層学習モデルを最初からトレーニングしたり、既存の Keras モデルを推論用にインポートしたり、既存の事前トレーニング済みモデルをタスクに合わせて微調整するための転移学習を活用したりするためのシンプルな API を提供します。

  • Kotlin DataFrame は、構造化データ処理用のライブラリです。Kotlin 言語のフルパワーと、Jupyter ノートブックおよび REPL での断続的なコード実行によって提供される機会の両方を活用することで、Kotlin の静的型付けとデータの動的な性質を調和させることを目的としています。

  • Kotlin for Apache Spark は、 Kotlin と Apache Spark の間に欠けていた互換性の層を追加します。これにより、Kotlin 開発者は、データ クラスなどの使い慣れた言語機能や、中括弧やメソッド参照内の単純な式としてラムダ式を使用できるようになります。

  • kotlin-statistics は、探索統計と実稼働統計の拡張機能を提供するライブラリです。sum基本的な数値リスト/シーケンス/配列関数 (から)、スライス演算子 ( skewnessなど)、ビニング演算子、離散 PDF サンプリング、単純ベイジアン分類器、クラスタリング、線形回帰などがサポートされています。countBysimpleRegressionBy

  • kmathは、最初はNumPyからインスピレーションを得て、より柔軟な抽象化に進化した実験的なライブラリですKotlin 型の代数構造に結合された数学演算を実装し、線形構造、式、ヒストグラム、ストリーミング操作の API を定義し、既存の Java および Kotlin ライブラリ ( ND4J 、 Commons Math 、 Multik など) に交換可能なラッパー提供ます

  • kranglは、 R のdplyrとPython のpandasからインスピレーションを得たライブラリです。このライブラリは、関数スタイル API を使用したデータ操作の関数を提供します。また、表形式データのフィルタリング、変換、集計、および再形成のための関数も含まれています。

  • lets-plot は、Kotlin で書かれた統計データ プロット ライブラリです。Lets-Plot は、JVM だけでなく、JS や Python にも対応したマルチプラットフォームです。

  • kravis は、 R のggplotからインスピレーションを得た、表形式のデータ視覚化のためのもう 1 つのライブラリです

  • londogard-nlp-toolkit は、単語/サブワード/センテンスの埋め込み、単語の頻度、ストップワード、ステミングなどの自然言語処理を行う際のユーティリティを提供するライブラリです。

Javaライブラリ

Kotlin は Java との相互運用性に対する最上級のサポートを提供するため、データ サイエンス用の Kotlin コードで Java ライブラリを使用することもできます。これらのライブラリの例をいくつか示します。

  • DeepLearning4J - Java 深層学習ライブラリ

  • ND4J - JVM 用の効率的な行列演算ライブラリ

  • Dex - Java ベースのデータ視覚化ツール

  • Smile - 包括的な機械学習、自然言語処理、線形代数、グラフ、補間および視覚化システム。Java API に加えて、Smile は機能的なKotlin API、Scala および Clojure API も提供します。

    • Smile-NLP-kt - Smile の自然言語処理部分の Scala インプリシットを Kotlin 拡張関数とインターフェイス形式で書き換えます。
  • Apache Commons Math - Java 用の共通数学、統計、機械学習ライブラリ

  • NM Dev - 古典数学をすべてカバーする Java 数学ライブラリ。

  • OptaPlanner - 最適化計画問題のソルバー ユーティリティ

  • Charts - 開発中の科学的な JavaFX グラフ作成ライブラリ

  • Apache OpenNLP - 自然言語テキストを処理するための機械学習ベースのツールキット

  • CoreNLP - 自然言語処理ツールキット

  • Apache Mahout - 回帰、クラスタリング、推奨のための分散フレームワーク

  • Weka - データ マイニング タスク用の機械学習アルゴリズムのセット

  • Tablesaw - Java データフレーム。Plot.ly に基づく視覚化ライブラリが含まれています

このリストでは不十分な場合は、 Thomas Nield のKotlin Machine Learning Demos GitHub リポジトリでショーケースを備えた他のオプションを見つけることができます。

競技プログラミングのための Kotlin

このチュートリアルは、これまでに Kotlin を使用したことがない競技プログラマー、およびこれまで競技プログラミング活動に参加したことがない Kotlin 開発者に適しています。このチュートリアルは、読者が適切なプログラミング スキルを持っていることを前提としています。

競技プログラミングは、競技者が厳しい制約の下で指定されたアルゴリズムの問​​題を正確に解決するプログラムを作成する知的スポーツです。問題は、ソフトウェア開発者なら誰でも非常に少ないコードで解決して正しい答えを得ることができるほど単純な場合もあれば、特殊なアルゴリズム、データ構造の知識、および多くの練習を必要とするほど複雑な場合もあります。Kotlin は競技プログラミング向けに設計されたものではありませんが、競技プログラミングにぴったり適合し、プログラマーが書いたり読んだりする必要がある定型コードの量を大幅に減らし、動的スクリプト言語とほぼ同じようにコードを書くことが可能になり、同時にツールとパフォーマンスもサポートします。静的に型付けされた言語。

Kotlin 開発環境をセットアップする方法については、「Kotlin/JVM 入門」を参照してください。競技プログラミングでは通常、単一のプロジェクトが作成され、各質問に対する回答が単一のソース ファイルに記述されます。

簡単な例: 到達可能性の問題

具体的な例を見てみましょう。

Codeforces Round 555 Breakout 3 は 4 月 26 日に開催されました。つまり、開発者なら誰でも挑戦できる質問が用意されています。このリンクを開いて質問を読むことができます。この一連の問題の中で最も簡単なのは、問題 A: 到達可能な番号です。問題文で説明されているように、単純なアルゴリズムを実装する必要があります。

これを解決するには、任意の名前で Kotlin ソース ファイルを作成します。A.ktそれはいいです。まず、問題ステートメントで指定された関数を次のように実装する必要があります。

関数 f(x) は、x に 1 を加算し、結果の数値が少なくとも 1 つのゼロで終わる場合は、そのゼロを削除する方法で表します。

Kotlin は、開発者をどちらかのスタイルに押し付けることなく、命令型プログラミング スタイルと関数型プログラミング スタイルの両方をサポートする実用的で折衷的な言語です。関数は、末尾再帰などの Kotlin 機能fを使用して、関数型スタイルで実装できます。

tailrec fun removeZeroes(x: Int): Int =
    if (x % 10 == 0) removeZeroes(x / 10) else x

fun f(x: Int) = removeZeroes(x + 1)

可変変数 ( Kotlin ではvarで示されます)fを含む従来のwhile ループを使用して、関数の命令型実装を作成することもできます。

fun f(x: Int): Int {
    var cur = x + 1
    while (cur % 10 == 0) cur /= 10
    return cur
}

Kotlin では型推論が広く使用されているため、型は多くの場所で省略可能ですが、各宣言にはコンパイル時に既知の明確に定義された静的型が存在します。

nここで残っているのは、入力を読み取る main 関数を作成し、問題ステートメントで必要なアルゴリズムの残りの部分を実装することだけです。標準入力に与えられた最初の数値に対して関数を繰り返しf適用した結果生じる個別の整数の数を数えます。

デフォルトでは、Kotlin は JVM 上で実行され、動的サイズの配列 ( )、ハッシュベースのマップとセット (/)、ツリーベースのマップとセットなどの一般的なコレクションとデータ構造を含む豊富で効率的なコレクション ライブラリに直接アクセスArrayListできHashMapますHashSet。 ( TreeMap/ TreeSet) を設定します。f整数ハッシュ セットを使用して、関数を適用するときに到達した値を追跡すると、この問題に対する単純な命令型の解決策は次のように記述できます。

【Kotlin 1.6.0以降】

fun main() {
    var n = readln().toInt() // 读取输入的整数
    val reached = HashSet<Int>() // 可变的哈希 set
    while (reached.add(n)) n = f(n) // 迭代函数 f
    println(reached.size) // 输出答案
}

競技プログラミングでは不正な入力を処理する必要はありません。競技プログラミングにおける入力形式は常に正確に指定されており、実際の入力が問題ステートメントの入力仕様から逸脱することはできません。Kotlin のreadln()関数を使用できるのはそのためで、この関数は入力文字列が存在することをアサートし、存在しない場合は例外をスローします。同様に、入力が整数でない場合、String.toInt()関数は例外をスローします。

【初期バージョン】

fun main() {
    var n = readLine()!!.toInt() // 读取输入的整数
    val reached = HashSet<Int>() // 可变的哈希 set 
    while (reached.add(n)) n = f(n) // 迭代函数 f
    println(reached.size) // 输出答案
}

readLine()関数呼び出しの後にnull アサーション演算子 が使用されていることに注意してください!!Kotlin の関数は、 null 許容型をreadLine()返し、入力が完了したときに返すように定義されているため、開発者は入力がない場合の処理​​を明示的に強制されます。 String?null

競技プログラミングでは不正な入力を処理する必要はありません。競技プログラミングでは、入力形式は常に正確に指定され、実際の入力が問題ステートメントの入力仕様から逸脱することはできません。これは、null アサーション演算子の!!本質的な動作です。入力文字列が存在することをアサートするか、そうでない場合は例外をスローします。String.toInt()にも同じことが当てはまります

すべてのオンライン競技プログラミング アクティビティでは、事前に作成されたコードの使用が許可されているため、独自の競技プログラミング指向のツール関数ライブラリを定義して、実際の問題解決コードの読み書きを容易にすることができます。その後、そのコードを問題解決のテンプレートとして使用できます。たとえば、競技プログラミングで入力を読み取るために次のヘルパー関数を定義できます。

【Kotlin 1.6.0以降】

private fun readStr() = readln() // 一行字符串
private fun readInt() = readStr().toInt() // 单个整数
// 用于在解题中会用到的其他类型的类似声明等

【初期バージョン】

private fun readStr() = readLine()!! // 一行字符串
private fun readInt() = readStr().toInt() // 单个整数
// 用于在解题中会用到的其他类型的类似声明等

privateここで(プライベート)visible 修飾子を使用していることに注意してください可視性修飾子の概念は競技プログラミングとは何の関係もありませんが、これにより、パブリック宣言の競合に関するエラーが発生することなく、同じテンプレートに基づく複数のソリューション ファイルを同じパッケージに配置することができます。

関数操作の例: 長い数の問題

より複雑な問題の場合は、Kotlin の豊富なコレクション関数スタイルの操作ライブラリが便利です。これにより、テンプレート コードを大幅に削減し、上から下、左から右のストリーミング データ変換パイプラインとしてコードを記述することができます。たとえば、問題 B: 長い数値の問題は、単純な貪欲アルゴリズムで実装されており、変更可能な変数を使用せずにこのスタイルで記述できます。

【Kotlin 1.6.0以降】

fun main() {
    // 读取输入
    val n = readln().toInt()
    val s = readln()
    val fl = readln().split(" ").map { it.toInt() }
    // 定义局部函数 f
    fun f(c: Char) = '0' + fl[c - '1']
    // 贪婪查找第一个与最后一个索引
    val i = s.indexOfFirst { c -> f(c) > c }
        .takeIf { it >= 0 } ?: s.length
    val j = s.withIndex().indexOfFirst { (j, c) -> j > i && f(c) < c }
        .takeIf { it >= 0 } ?: s.length
    // 组合并写出答案
    val ans =
        s.substring(0, i) +
        s.substring(i, j).map { c -> f(c) }.joinToString("") +
        s.substring(j)
    println(ans)
}

【初期バージョン】

fun main() {
    // 读取输入
    val n = readLine()!!.toInt()
    val s = readLine()!!
    val fl = readLine()!!.split(" ").map { it.toInt() }
    // 定义局部函数 f
    fun f(c: Char) = '0' + fl[c - '1']
    // 贪婪查找第一个与最后一个索引
    val i = s.indexOfFirst { c -> f(c) > c }
        .takeIf { it >= 0 } ?: s.length
    val j = s.withIndex().indexOfFirst { (j, c) -> j > i && f(c) < c }
        .takeIf { it >= 0 } ?: s.length
    // 组合并写出答案
    val ans =
        s.substring(0, i) +
        s.substring(i, j).map { c -> f(c) }.joinToString("") + 
        s.substring(j)
    println(ans)
}

この高密度コードでは、コレクション変換に加えて、ローカル関数やelvis 演算子 ?:などの便利な Kotlin.takeIf { it >= 0 } ?: s.length機能確認できます。elvis 演算子を使用すると、「 が正の数の場合はその値を取得し、それ以外の場合はその値を取得します」のようなものを表現できます。もちろん Kotlin を使用して追加の可変変数を作成し、同じコードを命令型スタイルで表現することもできます。

この競技プログラミング タスクで入力の読み取りをよりコンパクトにするために、次の入力読み取りヘルパー関数のリストを使用できます。

【Kotlin 1.6.0以降】

private fun readStr() = readln() // 一行字符串
private fun readInt() = readStr().toInt() // 单个整数
private fun readStrings() = readStr().split(" ") // 字符串列表
private fun readInts() = readStrings().map { it.toInt() } // 整数列表

【初期バージョン】

private fun readStr() = readLine()!! // 一行字符串
private fun readInt() = readStr().toInt() // 单个整数
private fun readStrings() = readStr().split(" ") // 字符串列表
private fun readInts() = readStrings().map { it.toInt() } // 整数列表

これらのヘルパー関数を使用すると、入力を読み取るコードの部分が単純になり、問題ステートメントの入力仕様に 1 行ずつ厳密に従います。

// 读取输入
val n = readInt()
val s = readStr()
val fl = readInts()

競技プログラミングでは、コードは一度書くだけでよく、後でサポートされないため、産業用プログラミングの実践で通常よりも短い名前を変数に付けるのが通例であることに注意してください。もちろん、これらの名前は通常、配列、インデックスaテーブルの行番号と列番号座標などのニーモニックですまた、入力データの名前を問題ステートメントで指定したものと同じにしておくと簡単です。もちろん、より複雑な問題には解決するためにより多くのコードが必要となり、変数名や関数名が長くなり、一目瞭然になります。ijrcxy

その他のヒントとコツ

競技プログラミングには通常、次のような入力があります。

入力の最初の行には 2 つの整数が含まれておりnk

Kotlin では、整数のリストを構造化する次のステートメントを使用して、この行を簡潔に解析できます。

val (n, k) = readInts()

多くの人は、構造化されていない入力形式を解析するために JVM のjava.util.Scannerクラスを使用することに慣れています。Kotlin は JVM ライブラリと適切に相互運用できるように設計されているため、Kotlin での使用は自然です。ただし、java.util.Scanner非常に遅いことに注意してください。実際、これは非常に遅いため、105 個以上の整数を解析する場合、単純な Kotlin で実行できる一般的な 2 秒の制限をおそらく満たさないでしょうsplit(" ").map { it.toInt() }

Kotlin での出力の書き込みは通常、 println(...)を呼び出してKotlin の文字列テンプレートを使用するだけで簡単ですただし、出力に約 105 行以上が含まれる場合は注意が必要です。printlnKotlin のこの出力では、各行の後に書き込みバッファーが自動的にフラッシュされるため、何度も呼び出すと遅すぎます。配列またはリストから複数の行をより速く書き込む方法は、次のようにセパレータを指定してjoinToString()関数を使用することです。"\n"

println(a.joinToString("\n")) // 数组/list 中的每个元素占一行

Kotlin を学ぶ

Kotlin は、特にすでに Java を知っている人にとっては習得が簡単です。ソフトウェア開発者向けに、Kotlin の基本構文の簡単な紹介がWeb サイトのリファレンス セクションにあり、基本構文から始まります。

IDEA にはJava から Kotlin へのコンバーターが組み込まれています。Java に精通している人は、Java を使用して、対応する Kotlin 構文構造を学習できますが、完璧ではないため、Kotlin に慣れ、 Kotlin のイディオムを学習する必要があります

Kotlin 構文と Kotlin 標準ライブラリ API を学習するための優れたリソースは、Kotlin Heartprintです。

参照文書:

本書について Kotlin 公式ドキュメント 中国語版

Kotlin 開発 Android-基本記事-ナレッジ

おすすめ

転載: blog.csdn.net/boonya/article/details/130294643