LoginSignup
4
6

More than 5 years have passed since last update.

JavaからみたScalaの書き方

Last updated at Posted at 2018-09-09

タイトルの通りです。
Scalaやりたくなったのでまとめてみました。
学習中に都度、更新予定。
ちなみに筆者の経歴はC#4年、Java1年です。

命名規則

Javaと同じで良さそう。キャメルケース

細かなルール

  • 末尾セミコロン不要
  • コメントは同じ //と/* */

変数

宣言で型推論が効く!(Javaだと10から)

val hoge = 1 // imutable(不変。final付きの変数)
var hoge = 1 // mutable(可変)

型指定だと、

val i:Int = 1
val str:String = "Hi!"

文字列の中に変数を埋め込むには、リテラルの前にsをつけて変数に$をつける

val firstName = j
val familyName = ichikawa
val str = s"my name is $firstName - $familyName"

リテラル内にコードを埋め込むこともできる

val str = s"My weight is ${weight + 3}"

if文

書き方は同じ
値を返す式として書ける

val age = 30
val result =
  if (age >= 30) "over 30"
    else "under 30"
println(result)// over 30

演算子

基本同じだけど、三項演算子はないみたい。ifで値を返せるので代用できる

val result = if (age >= 30) "over 30" else "under 30"

switch

matchと言うらしい

val team = "ソ"
val result = team match {
  case "ロ" | "鴎" => "ロッテ" // or条件
  case other => s"undefined: ${other}" // default
}
println(result)
// undefined: ソ

ループ

whileは同じだけど、forはちと異なる
条件をジェネレーターと言うらしい

for (i <- 0 to 3) println(i) // 条件を 0 until 4 で0以上4未満とできる
// 0
// 1
// 2
// 3

for (i <- 0 to 3 if i != 2) println(i) // 条件付き
// 0
// 1
// 3

var result = for (i <- 0 to 3) yield i // 結果を取得
for (i <- result) println(i)

for (i <- 0 to 3; j <- 0 to 3) println(s"$i, $j") // forの入れ子

メソッド

javaだと、

public void sayHello() {
  System.out.println("hello");
}

public String sayHelloStr() {
  return "hello";
}

public String getHelloMessage(String firstName, String familyName) {
  return "Hello " + firstName + " " + familyName;
}

が、

def sayHello: Unit = {
  println("hello")
}

def getHelloStr: String = {
  "Hello" // return 省略可
}

def getHelloMessage(firstName: String, familyName: String): String = {
  s"Hello $firstName $familyName"
  // firstName: String = "taro" のようにデフォルト値を設定できる。C#と同じだ
}

クラス

class Human(val name: String) { // パラメータ定義でコンストラクタになる
  def sayHello() = println("hello") // ラムダっぽいメソッド定義
}

// インスタンス化
val human = new Human"j-ichikawa"
val name = human.name;
human.sayHello()

継承は、

class PerfectHuman(name: String) extends Human(name) {
  override def sayHello() = println("perfect hello")
}

パッケージ

宣言は同じ

package aaa.bbb.ccc

呼び出しは、

import aaa.bbb.ccc.ddd // 個別
import aaa.bbb.ccc.ddd.{ddd, eee} // 複数
import aaa.bbb.ccc.ddd._ // まとめて

アクセス修飾子

public, protected, privateつけたクラスのメンバーへの付け方、見え方は同じ
何もつけないとデフォルトでpublicになる(C#だとprivateがデフォルトだよね

final

クラス、メンバーにつけたときの働きはJavaと同じ。変数をimutableにするにはvalで宣言する

object

型ではなく、キーワードらしい
同名のクラスにobjectをつける

// コンパニオンオブジェクトというみたい
object Human {
  def sayHello() = println("hello") // クラスメソッドのようにインスタンス化せず呼べる
  def apply(name: String) = new Human(name) // ファクトリーメソッドの定義になる
}

// こちらはコンパニオンクラス
class Human (val name: String) {
  def sayHello() = println("hello")
}

// コンパニオンオブジェクトの使い方
Human.sayHello()
val taro = Human("taro") // taroインスタンスの生成

printlnはPredefというオブジェクトのメソッドらしい

新しい概念。。

抽象クラス

うん、抵抗なし

abstract class Animal {
  def cry()
}

class Cat extends Animal {
  def cry() = println("にゃあああ")
}

インターフェイス

トレイトというらしい

trait Runnable {
  def run() = println("ダダダ。。。")
}

class Player extends Runnable // 実装 継承と同じ構文 C#と同じ
class SuperPlayer extends Player with Runnable // 継承していたらwithで実装

更新中。。。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6