「Scala Javaプログラマ向けチュートリアル」の版間の差分
ナビゲーションに移動
検索に移動
| 1行目: | 1行目: | ||
| − | ==Scala Javaプログラマ向けチュートリアル== | + | ==[[Scala Javaプログラマ向けチュートリアル]]== |
[[Scala]] | | [[Scala]] | | ||
| 5行目: | 5行目: | ||
==インポート== | ==インポート== | ||
| − | * | + | *[[Scala]]の強みの一つは、Javaと簡単に相互運用できること |
| − | *java.lang | + | *java.lang パッケージはデフォルトでインポートされ、[[その他]]も必要に応じてインポートできる |
| − | * | + | *[[Scala]]のimportは、Javaによく似ているが、もっと強力である。 |
| − | *_ を * の代わりに利用する(* | + | *_ を * の代わりに利用する(*は[[Scala]]の識別子のため) |
import java.util.{Date,Locale} | import java.util.{Date,Locale} | ||
| 29行目: | 29行目: | ||
<blockquote>df.format(now)</blockquote> | <blockquote>df.format(now)</blockquote> | ||
==すべてオブジェクト== | ==すべてオブジェクト== | ||
| − | * | + | *[[Java]]とことなり、数値や関数もオブジェクト |
===数値もオブジェクト=== | ===数値もオブジェクト=== | ||
*以下のような計算式を | *以下のような計算式を | ||
| 46行目: | 46行目: | ||
(1).+(2) | (1).+(2) | ||
===関数もオブジェクト=== | ===関数もオブジェクト=== | ||
| − | * | + | *[[Java]]プログラマーにとって意外なのは、関数もオブジェクトだということだろう |
*関数を引数として渡すことがでる | *関数を引数として渡すことがでる | ||
*変数に格納することができる | *変数に格納することができる | ||
| 70行目: | 70行目: | ||
*一度しか使わないのに名前を持っていた | *一度しか使わないのに名前を持っていた | ||
*これらは不要に思われる | *これらは不要に思われる | ||
| − | * | + | *[[Scala]]では、無名関数を利用することが出来る |
*=> は関数の引数リストとボディを分ける | *=> は関数の引数リストとボディを分ける | ||
*この例では、=>の左側の括弧に引数リストは無い | *この例では、=>の左側の括弧に引数リストは無い | ||
| 85行目: | 85行目: | ||
} | } | ||
==クラス== | ==クラス== | ||
| − | * | + | *[[Scala]]では、クラスはJavaに近い文法で宣言する |
*一つ重要な違いは、クラスはパラメータを持つことが出来る | *一つ重要な違いは、クラスはパラメータを持つことが出来る | ||
*以下は、複素数を定義する例 | *以下は、複素数を定義する例 | ||
2020年2月16日 (日) 04:31時点における最新版
Scala Javaプログラマ向けチュートリアル
Scala |
インポート
- Scalaの強みの一つは、Javaと簡単に相互運用できること
- java.lang パッケージはデフォルトでインポートされ、その他も必要に応じてインポートできる
- Scalaのimportは、Javaによく似ているが、もっと強力である。
- _ を * の代わりに利用する(*はScalaの識別子のため)
import java.util.{Date,Locale}
import java.text.DateFormat
import java.text.DateFormat._
object JpDate {
def main(args: Array[String]) {
val now = new Date
val df = getDateInstance(LONG, Locale.JAPAN)
println(df format now)
}
}
2013/12/18
- メソッドの引数が、1つの場合 挿入記法(infix syntax)を利用できる
<blockquote>df format now</blockquote>
- 冗長にも書ける
<blockquote>df.format(now)</blockquote>
すべてオブジェクト
- Javaとことなり、数値や関数もオブジェクト
数値もオブジェクト
- 以下のような計算式を
scala> val x = 2 x: Int = 2 scala> 1 + 2 * 3 / x res1: Int = 4
- メソッドの呼び出しとしても書くことが出来る
scala> (1).+(((2).*(3))./(x)) res2: Int = 4
- 次のように書くと 1. が Doubleとみなされてしまう
1.+(2)
- 次のように記述する
(1).+(2)
関数もオブジェクト
- Javaプログラマーにとって意外なのは、関数もオブジェクトだということだろう
- 関数を引数として渡すことがでる
- 変数に格納することができる
- 他の関数に戻り値として渡すことができる
- 関数を値として扱えることが、関数プログラミングの興味深いパラダイムの土台となっている
object Timer {
def oncePerSecond(callback: () => Unit) {
while(true) {
callback(); Thread sleep 1000
}
}
def timeFlies() {
println("time flies like an arrow...")
}
def main(args: Array[String]) {
oncePerSecond(timeFlies)
}
}
無名関数
- 上記の例を少し変えたもの
- timeFiles関数は、oncePerSecond に渡されるためだけに定義されていた
- 一度しか使わないのに名前を持っていた
- これらは不要に思われる
- Scalaでは、無名関数を利用することが出来る
- => は関数の引数リストとボディを分ける
- この例では、=>の左側の括弧に引数リストは無い
object Timer {
def oncePerSecond(callback: () => Unit) {
while(true) {
callback(); Thread sleep 1000
}
}
def main(args: Array[String]) {
oncePerSecond(
() => println("time flies like an arrow..."))
}
}
クラス
- Scalaでは、クラスはJavaに近い文法で宣言する
- 一つ重要な違いは、クラスはパラメータを持つことが出来る
- 以下は、複素数を定義する例
class Complex(real: Double, imaginary: Double) {
def re() = real;
def im() = imaginary
}
- 複素数クラスは、2つの引数をとり、インスタンス作成時に引数に値が与えられる必要がある
© 2006 矢木浩人