「Scala Javaプログラマ向けチュートリアル」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==Scala Javaプログラマ向けチュートリアル== [Scala] *http://docs.scala-lang.org/tutorials/scala-for-java-programmers.html ==インポート== *Scala…」) |
|||
1行目: | 1行目: | ||
==Scala Javaプログラマ向けチュートリアル== | ==Scala Javaプログラマ向けチュートリアル== | ||
− | [Scala] | + | [[Scala]] |
*http://docs.scala-lang.org/tutorials/scala-for-java-programmers.html | *http://docs.scala-lang.org/tutorials/scala-for-java-programmers.html | ||
25行目: | 25行目: | ||
*メソッドの引数が、1つの場合 挿入記法(infix syntax)を利用できる | *メソッドの引数が、1つの場合 挿入記法(infix syntax)を利用できる | ||
− | + | <blockquote>df format now</blockquote> | |
*冗長にも書ける | *冗長にも書ける | ||
− | + | <blockquote>df.format(now)</blockquote> | |
==すべてオブジェクト== | ==すべてオブジェクト== | ||
*Javaとことなり、数値や関数もオブジェクト | *Javaとことなり、数値や関数もオブジェクト | ||
===数値もオブジェクト=== | ===数値もオブジェクト=== | ||
*以下のような計算式を | *以下のような計算式を | ||
− | scala | + | scala> val x = 2 |
x: Int = 2 | x: Int = 2 | ||
− | scala | + | scala> 1 + 2 * 3 / x |
res1: Int = 4 | res1: Int = 4 | ||
*メソッドの呼び出しとしても書くことが出来る | *メソッドの呼び出しとしても書くことが出来る | ||
− | scala | + | scala> (1).+(((2).*(3))./(x)) |
res2: Int = 4 | res2: Int = 4 | ||
53行目: | 53行目: | ||
object Timer { | object Timer { | ||
− | def oncePerSecond(callback: () = | + | def oncePerSecond(callback: () => Unit) { |
while(true) { | while(true) { | ||
callback(); Thread sleep 1000 | callback(); Thread sleep 1000 | ||
71行目: | 71行目: | ||
*これらは不要に思われる | *これらは不要に思われる | ||
*Scalaでは、無名関数を利用することが出来る | *Scalaでは、無名関数を利用することが出来る | ||
− | *= | + | *=> は関数の引数リストとボディを分ける |
− | *この例では、= | + | *この例では、=>の左側の括弧に引数リストは無い |
object Timer { | object Timer { | ||
− | def oncePerSecond(callback: () = | + | def oncePerSecond(callback: () => Unit) { |
while(true) { | while(true) { | ||
callback(); Thread sleep 1000 | callback(); Thread sleep 1000 | ||
81行目: | 81行目: | ||
def main(args: Array[String]) { | def main(args: Array[String]) { | ||
oncePerSecond( | oncePerSecond( | ||
− | () = | + | () => println("time flies like an arrow...")) |
} | } | ||
} | } |
2020年2月15日 (土) 08:05時点における版
Scala Javaプログラマ向けチュートリアル
インポート
- 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 矢木浩人