[2023] Kotlin チュートリアル
記事ディレクトリ
パート II オブジェクト指向プログラミングと関数型プログラミング
第 13 章 関数型プログラミングの基礎 — 高階関数とラムダ式
関数型プログラミングの考え方はオブジェクト指向と同じくらい古いものですが、関数型プログラミングをサポートするコンピューター言語が登場したのはごく最近のことです。これらの言語には、Swift、Python、Java 8、および C++ 11 が含まれます。新しい言語として、Kotlin は関数型プログラミングもサポートします。
13.5 インライン関数
上位関数では、パラメータが関数型の場合、Lambda 式を受け取ることができ、Lambda 式はコンパイル時に匿名クラスにコンパイルされ、関数が呼び出されるたびにオブジェクトが作成されます。これは関数によって繰り返し呼び出されるため、多くのオブジェクトを作成すると実行時のオーバーヘッドが発生します。
この問題を解決するために、Kotlin ではそのような関数をインライン関数として宣言できます。
[ヒント] インライン関数は、コンパイル時に関数呼び出しコードを生成しませんが、各関数呼び出しを関数本体の実際のコードに置き換えます。
13.5.3 with および apply 関数の使用
オブジェクトに複数のプロパティを設定したり、複数の関数を呼び出したりする必要がある場合は、 with または applyl 関数を使用できます。let 関数と同様に、Kotlin のすべてのオブジェクトはこれら 2 つの関数を使用できます。
栗を取る:
import java.awt.BorderLayout
import javax.swing.JButton
import javax.swing.JFrame
import javax.swing.JLabel
class MyFrame(title: String) : JFrame(title) {
init {
// 创建标签
val label = JLabel("Label")
// 创建Button1
val button1 = JButton()
button1.text = "Button1"
button1.toolTipText = "Button1"
// 注册事件监听器, 监听Button1 的单击事件
button1.addActionListener {
label.text = "单击Button1" }
// 创建Button2
val button2 = JButton().apply {
text = "Button2"
toolTipText = "Button2"
// 注册事件监听器, 监听Button2 的单击事件
addActionListener {
label.text = "单击Button2" }
// 添加Button2 到内容面板
contentPane.add(this, BorderLayout.SOUTH)
}
with(contentPane) {
// 添加标签到内容面板
add(label, BorderLayout.NORTH)
// 添加Button1 到内容面板
add(button1, BorderLayout.CENTER)
println(height)
println(this.width)
}
// 设置窗口大小
setSize(350, 120)
// 设置窗口可见
isVisible = true
}
}
fun main() {
// 创建Frame 对象
MyFrame("MyFrame")
}
上記のコードは Swing ウィンドウであり、Swing は Java のグラフィカル ユーザー インターフェイスの紹介です [これについては後で説明します]。
The code creates and calls the properties and functions of Button1. この従来のアプローチでは、同じオブジェクトのプロパティまたは関数が複数回呼び出されるため、 with または apply 関数を使用できます。
後で、applyt 関数を使用して、Button2 のプロパティと関数を作成して呼び出します。apply 関数の後に Lambda 式が続きます。呼び出す必要があるプロパティと関数は、Lambda 式に配置されます。オブジェクト名 button2 は、Lambda で省略されます。式, たとえば,text="Button2
式 式は、呼び出されるボタン2のテキスト属性を示しています. 適用関数で現在のオブジェクトを参照する場合, this キーワードを使用できます. たとえば, これでは, 適用関数にcontentPane.add(this, BorderLayout..SOUTH)
は戻り値であり、その戻り値は現在のオブジェクトです。
If you don't need to return a value, you can use the with function. The with function is similar to the apply function, followed by a Lambda expression. 呼び出す必要のあるプロパティと関数は、Lambda 式に配置されます。現在のオブジェクトが with 関数で参照されている場合は、this キーも使用されます。