ç§ãã¡ã®ããŒã ã¯ãèšäºã®èè
ãšåæ§ã«ãScalaããäž»èŠãªèšèªãšããŠKotlinã«ã»ãŒ1幎ãçµéããŸããã ç§ã®æèŠã¯äž»ã«èè
ãšäžèŽããã®ã§ã圌ã®èå³æ·±ãèšäºã®ç¿»èš³ãæäŸããŸãã
ããã°ãæŽæ°ããªãã£ãã®ã§ãããã¯ãŸãšããªæéã§ããã ä»ããäžå¹Žãç§ã¯ã¡ã€ã³ã®èšèªã§ããScalaããKotlinã«åãæ¿ããŸããã ãã®èšèªã¯ãScalaã«ããå€ãã®èœãšãç©ŽãšãããŸãããåé¿ã§ããäžæ¹ã§ãScalaã§æ°ã«å
¥ã£ãŠããå€ãã®è¯ããã®ãåããŠããŸããã
以äžã«ãScalaãšKotlinã§æ°ã«å
¥ã£ãŠããäŸãšãäž¡èšèªã§ã®å®è£
æ¹æ³ã®æ¯èŒã瀺ããŸãã
宣èšãšåæšè«
äž¡æ¹ã®èšèªã§ç¹ã«æ°ã«å
¥ã£ãŠããã®ã¯ãã©ã¡ããéçã«åæšè«ã§åä»ããããŠããããšã§ãã ããã«ãããã³ãŒãå
ã§é¢åãªå®£èšãããããšãªããéçåä»ãã®åãæ倧éã«æŽ»çšã§ããŸãïŒ å
ïŒå®£èšåãã€ã©ãŒãã¬ãŒã ïŒã ã»ãšãã©ã®å Žåãããã¯äž¡æ¹ã®èšèªã§æ©èœããŸãã äž¡æ¹ã®èšèªã§ãååã®åŸã«å€æ°ã®åã®ãªãã·ã§ã³ã®å®£èšãšãšãã«ãäžå€ã®åã®èšå®ã远跡ãããŸãã
ãµã³ãã«ã³ãŒãã¯äž¡æ¹ã®èšèªã§åãã§ãã
ageããã³type Intãšããååã®äžå€å€æ°ã®å®£èšïŒ
val age = 1
Stringåã®å¯å€å€æ°ã®å®£èšïŒ
var greeting = "Hello"
ã©ã¡ãã®èšèªããã©ã ãé¢æ°ãæåã®ã¯ã©ã¹ã®ãªããžã§ã¯ããšããŠãµããŒãããŠããŸããããã¯ãå€æ°ã«å²ãåœãŠãããé¢æ°ã«ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããšãã§ããŸãã
ã¹ã«ã©
val double = (i: Int) => { i * 2 }
ã³ããªã³
val double = {i: Int -> i * 2 }
ããŒã¿ / ã±ãŒã¹ã¯ã©ã¹
ScalaãšKotlinã«ã¯ã ããŒã¿ã¢ãã«ãªããžã§ã¯ãã®è¡šçŸã§ããããŒã¿ã¯ã©ã¹ã«å¯ŸããŠåæ§ã®æŠå¿µããããŸã ã
Scalaã¢ãããŒã
Scalaã§ã¯ããããã¯æ¬¡ã®ãããªã±ãŒã¹ã¯ã©ã¹ã§ãã
case class Person(name: String, age: Int)
- é©çšæ¹æ³ããããŸã ïŒã€ã³ã¹ã¿ã³ã¹ã®äœææã«æ°ããããŒã¯ãŒãã䜿çšããå¿
èŠã¯ãããŸããïŒ
- ã¢ã¯ã»ã¹ã¡ãœããã¯åããããã£ã«å¯ŸããŠå®£èšãããŸã ïŒ ããããã£ã varãšããŠå®£èšãããŠããå Žåã setterã¡ãœãããååšããŸãïŒ
- toString ã equalããã³hashCodeãåççã«å®£èšãããŠããŸã
- ã³ããŒæ©èœããããŸã
- é©çšè§£é€ã¡ãœããããããŸãïŒ ãã¿ãŒã³ãããã³ã°ã§ãããã®ã¯ã©ã¹ã䜿çšã§ããŸãïŒã
ã³ããªã³ã¢ãããŒã
Kotlinã¯ãããã®ã¯ã©ã¹ãããŒã¿ã¯ã©ã¹ãšåŒã³ãŸã
data class Person (val name: String, val age: Int)
äž»ãªæ©èœïŒ
- ã¢ã¯ã»ã¹ã¡ãœããã¯åããããã£ã«å¯ŸããŠå®£èšãããŸã ïŒ ããããã£ã varãšããŠå®£èšãããŠããå Žåã setterã¡ãœãããååšããŸãïŒã ããã¯ããŒã¿ã¯ã©ã¹ã®äŸå€çãªæ©èœã§ã¯ãªãããã®ã¹ããŒãã¡ã³ãã¯Kotlinã®ãã¹ãŠã®ã¯ã©ã¹ã«åœãŠã¯ãŸããŸãã
- åççã«å®£èšãããtoString ã equal ãããã³hashCode
- ã³ããŒæ©èœ
- component1..componentNé¢æ°ã é¡æšã«ããã unapplyãšããŠäœ¿çšãããŸã ã
- HibernateãJacksonãªã©ã®Javaãã¬ãŒã ã¯ãŒã¯ã«å¿
èŠãªJavaBean getterããã³setterãå€æŽãªãã§å®è£
ããŸãã
Kotlinã§ã¯ãã¯ã©ã¹ãåæåããããã«æ°ããããŒã¯ãŒããå¿
èŠãªãã®ãšåãããã«ãç¹å¥ãªé©çšã¡ãœããã¯å¿
èŠãããŸããã ãããã£ãŠãããã¯ä»ã®ã¯ã©ã¹ãšåæ§ã«æšæºã®ã³ã³ã¹ãã©ã¯ã¿å®£èšã§ãã
æ¯èŒ
åºæ¬çã«ã ã±ãŒã¹ã¯ã©ã¹ãšããŒã¿ã¯ã©ã¹ã¯äŒŒãŠããŸãã
以äžã®äŸã¯ãäž¡æ¹ã®èšèªã§åãããã«èŠããŸãã
val jack = Person("jack", 1) val olderJack = jack.copy(age = 2)
äžè¬ã«ã ããŒã¿ãšã±ãŒã¹ã¯ã©ã¹ã¯æ¥åžžäœ¿çšã§äº€æå¯èœã§ããããšãããããŸããã Kotlinã«ã¯ããŒã¿ã¯ã©ã¹ã®ç¶æ¿ã«ããã€ãã®å¶éããããŸãããèœãšãç©Žãé¿ããããã®equalsããã³componentNé¢æ°ã®å®è£
ãèããã°ãããã¯æå³çã«è¡ãããŸããã
Scalaã®å Žåã Kotlinã 'when'ãããã¯ã®ããŒã¿ã¯ã©ã¹ãæäœããæ¹æ³ãšæ¯èŒããŠãã¯ã©ã¹ã¯ãã¿ãŒã³ãããã«ãããŠãã匷åã§ãã
Kotlinã®ã¢ãããŒãã¯ãæ¢åã®Javaãã¬ãŒã ã¯ãŒã¯ã«å¯ŸããŠæ¬¡ã®ããã«æ©èœããŸãã éåžžã®Java Beanã®ããã«èŠããŸãã
ã©ã¡ãã®èšèªã§ããååã§ãã©ã¡ãŒã¿ãŒãæž¡ãããããã®ããã©ã«ãå€ãæå®ã§ããŸãã
å®å
šã«ãã«/ãªãã·ã§ã³
Scalaã¢ãããŒã
Scalaã§ã¯ã nullã¯ã¢ãããªãã·ã§ã³ãå®å
šã«äœ¿çšããããšã§ãã ç°¡åã«èšãã°ã ãªãã·ã§ã³ã¯æ¬¡ã®2ã€ã®ç¹å®ã®ç¶æ
ã®ããããã«ãªããŸã ãSome ïŒxïŒãŸãã¯None
val anOptionInt: Option[Int] = Some(1)
ãŸãã¯
val anOptionInt: Option[Int] = None
isDefinedããã³getOrElseé¢æ°ïŒããã©ã«ãå€ã瀺ãïŒã䜿çšããŠãªãã·ã§ã³ã§æäœããããšã¯å¯èœã§ãããããé »ç¹ã«äœ¿çšãããç¶æ³ã¯ãã¢ãããmap ã foreachããŸãã¯foldæŒç®åã§äœ¿çšãããå Žåã§ãã
ããšãã°ã次ã®ããã«2ã€ã®ãªãã·ã§ã³å€æ°ã®åèšãèšç®ã§ããŸãã
val n1Option: Option[Int] = Some(1) val n2Option: Option[Int] = Some(2) val sum = for (n1 <- n1Option; n2 <- n2Option) yield {n1 + n2 }
å€æ°sumã®å€ã¯SomeïŒ3ïŒã«ãªããŸãã forããŒã¯ãŒãã¯ã yieldããŒã¯ãŒãã®äœ¿çšã«å¿ããŠforeachãŸãã¯flatMapãšããŠäœ¿çšããæ¹æ³ã®è¯ãäŸã§ãã
å¥ã®äŸïŒ
case class Person(name: String, age: Option[Int]) val person: Option[Person] = Some(Person("Jack", Some(1))) for (p <- person; age <- p.age) { println(s"The person is age $age") }
ãThe person is age 1ããšããè¡ãå°å·ãããŸãã
ã³ããªã³ã¢ãããŒã
Kotlinã¯ãæ¥åžžäœ¿çšã§éåžžã«å®çšçãªgroovyæ§æãåçšããŠããŸãã Kotlinã§ã¯ããã¹ãŠã®åã¯nulläžå¯ã§ããããïŒãã§æ瀺çã«nullå¯èœãšå®£èšããå¿
èŠããããŸã nullãå«ããããšãã§ããå Žå
åãäŸã次ã®ããã«æžãæããããšãã§ããŸãã
val n1: Int? = 1 val n2: Int? = 2 val sum = if (n1 != null && n2 != null) n1 + n2 else null
ããã¯ãKotlinãã³ã³ãã€ã«æãã§ãã¯ã匷å¶ããŠnullããã§ãã¯ããã«null蚱容å€æ°ã䜿çšãããªãããã«ããããšãé€ããJavaæ§æã«ã¯ããã«è¿ããããNullPointerExceptionãæããå¿
èŠã¯ãããŸããã ãŸãã nullã non-nullableãšããŠå®£èšãããå€æ°ã«å²ãåœãŠãããšã¯ã§ããŸããã ããã«ãã³ã³ãã€ã©ãŒã¯ã nullã®å€æ°ãåãã§ãã¯ããå¿
èŠæ§ãæé€ããã®ã«ååã¹ããŒãã§ãããJavaã®ãããªå€æ°ã®è€æ°ã®ãã§ãã¯ãåé¿ããŸãã
2çªç®ã®äŸãšåçã®Kotlinã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
data class Person(val name: String, val age: Int?) val person: Person? = Person("Jack", 1) if (person?.age != null) { printn("The person is age ${person?.age}") }
ãŸãã¯ããletãã䜿çšããŠããifããããã¯ã次ã®ããã«çœ®ãæããŸãã
person?.age?.let { person("The person is age $it") }
æ¯èŒ
Kotlinã§ã®ã¢ãããŒãã奜ãã§ãã èªã¿ãããç解ãããããè€æ°ã®ãã¹ããããã¬ãã«ã§äœãèµ·ããããç°¡åã«ææ¡ã§ããŸãã Scalaã®ã¢ãããŒãã¯ã¢ããã®æ¯ãèãã«åºã¥ããŠãããäžéšã®äººã
ã¯ãã¡ããããã奜ãã§ããŸãããç§èªèº«ã®çµéšããèšãã°ãã³ãŒãã¯å°é¡ã®æè³ã§ã¯éè² è·ã«ãªãã€ã€ãããšèšããŸãã mapãŸãã¯flatMapã䜿çšããéã®ãã®è€éãã«ã¯éåžžã«å€ãã®èœãšãç©Žããããã¢ããããã·ã¥ã§äœãééã£ãããšãããŠããå Žåãã代æ¿ãæ¢ããã«ãã¿ãŒã³ãããã䜿çšããŠããå Žåãã³ã³ãã€ã«æã«èŠåã衚瀺ãããŸãããæããã§ã¯ãªãäŸå€ ã
Kotlinã®ã¢ãããŒãã¯ãJavaã³ãŒãããã®åãããã©ã«ãã§nullå¯èœãšããäºå®ã«ãããJavaã³ãŒããšã®çµ±åã®ã®ã£ãããæžãããŸãïŒ ããã§èè
ã¯å®å
šã«æ£ããããã§ã¯ãããŸãããJavaã®åã¯nullableãšnull Scalaã¯ã nullãå®å
šã«ä¿è·ããªãæŠå¿µãšããŠnullããµããŒãããå¿
èŠããããŸã ã
æ©èœã³ã¬ã¯ã·ã§ã³
ãã¡ãããScalaã¯æ©èœçãªã¢ãããŒãããµããŒãããŠããŸãã Kotlinã¯å°ãå°ãªãã§ãããäž»èŠãªã¢ã€ãã¢ã¯ãµããŒããããŠããŸãã
以äžã®äŸã§ã¯ã foldããã³mapé¢æ°ã®æäœã«ç¹å¥ãªéãã¯ãããŸããã
ã¹ã«ã©
val numbers = 1 to 10 val doubles = numbers.map { _ * 2 } val sumOfSquares = doubles.fold(0) { _ + _ }
ã³ããªã³
val numbers = 1..10 val doubles = numbers.map { it * 2 } val sumOfSquares = doubles.fold(0) {x,y -> x+y }
ã©ã¡ãã®èšèªããã¬ã€ãžãŒã³ã³ãã¥ãŒãã£ã³ã°ã®ãã§ãŒã³ãšããæŠå¿µããµããŒãããŠããŸãã ããšãã°ã10åã®å¶æ°ã®åºåã¯æ¬¡ã®ããã«ãªããŸãã
ã¹ã«ã©
val numbers = Stream.from(1) val squares = numbers.map { x => x * x } val evenSquares = squares.filter { _%2 == 0 } println(evenSquares.take(10).toList)
ã³ããªã³
val numbers = sequence(1) { it + 1 } val squares = numbers.map { it * it } val evenSquares = squares.filter { it%2 == 0 } println(evenSquares.take(10).toList())
æé»çãªå€æãšæ¡åŒµã¡ãœãã
ããã¯ãScalaãšKotlinããããã«åå²ããé åã§ãã
Scalaã¢ãããŒã
Scalaã«ã¯æé»çãªå€æã®æŠå¿µããããå¿
èŠã«å¿ããŠå¥ã®ã¯ã©ã¹ã«èªåçã«å€æããããšã«ãããã¯ã©ã¹ã«é«åºŠãªæ©èœãè¿œå ã§ããŸãã åºåã®äŸïŒ
object Helpers { implicit class IntWithTimes(x: Int) { def times[A](f: => A): Unit = { for(i <- 1 to x) { f } } } }
次ã«ãã³ãŒãã§æ¬¡ã®ããã«äœ¿çšã§ããŸãã
import Helpers._ 5.times(println("Hello"))
ããã«ããããHelloãã5ååºåãããŸãã ããã¯ã "times"é¢æ°ïŒå®éã«ã¯Intã«ã¯ååšããªãïŒãåŒã³åºããããšãå€æ°ãIntWithTimesãªããžã§ã¯ãã«èªåçã«ããã¯ãããé¢æ°ãåŒã³åºããããšããäºå®ã«ããæ©èœããŸãã
ã³ããªã³ã¢ãããŒã
Kotlinã¯åæ§ã®æ©èœã«æ¡åŒµæ©èœã䜿çšããŸãã Kotlinã§ã¯ããã®ãããªæ©èœãå®è£
ããããã«ãæ¡åŒµãè¡ãããåã®åœ¢åŒã®ãã¬ãã£ãã¯ã¹ã®ã¿ã§ãéåžžã®é¢æ°ã宣èšããå¿
èŠããããŸãã
fun Int.times(f: ()-> Unit) { for (i in 1..this) { f() } }
5.times { println("Hello")}
æ¯èŒ
Kotlinã®ã¢ãããŒãã¯ãç§ãScalaã§ãã®æ©èœãäž»ã«äœ¿çšããæ¹æ³ãšäžèŽããŸããããããã«åçŽåãããç解å¯èœãªã¬ã³ãŒããšãã圢ã§ãããã«å©ç¹ããããŸãã
Kotlinã«ã¯ãªãScalaã®æ©èœã§ãèŠéããªããã®
ç§ã«ãšã£ãŠKotlinã®æé«ã®æ©èœã®1ã€ã¯ããã®æ©èœã«ãããããŸããããScalaã®Kotlinã«ã¯ãªãæ©èœã«ãããŸãã
- ååã«ããåŒã³åºã-ããã¯å¯èªæ§ãç Žå£ããŸãã é¢æ°ãæž¡ãããå Žåãåã«ã³ãŒããèŠãã ãã§é¢æ°ãã€ã³ã¿ãæž¡ãããããšããããããããªããŸãã ã©ã ãã®æ瀺çãªè»¢éãšæ¯èŒããŠããããããããå©ç¹ã¯èŠåœãããŸããã
- æé»ã®å€æ-ããã¯ç§ãæ¬åœã«å«ããªãã®ã§ãã ããã«ãããã€ã³ããŒãããããã®ã«å¿ããŠã³ãŒãã®åäœã倧å¹
ã«å€åããç¶æ³ãçºçããŸãã ãã®çµæãIDEãé©åã«ãµããŒããããŠããªããšãã©ã®å€æ°ãé¢æ°ã«æž¡ãããããèšãã®ã¯éåžžã«å°é£ã§ãã
- ãªãŒããŒããŒã-äžèšã®è€æ°ã®ã¢ããã®åé¡ã
- äžçœ®æãšåŸçœ®æã®ãªãã·ã§ã³ã®æ§æã®æ··ä¹±-Kotlinã¯ããå°ã圢åŒçã§ãã ãã®çµæããã®äžã®ã³ãŒãã¯ææ§ããå°ãªããªããèªã¿ããããªããåçŽãªã¿ã€ããã¹ãæãããªãšã©ãŒã«ãªãããšã¯ããã»ã©å®¹æã§ã¯ãããŸããã
- æŒç®åãæ倧ã«åå®çŸ©ããããšã«ãããKotlinã¯äž»èŠãªæŒç®åïŒ+ã-ãªã©ïŒã®ã¿ãäžæžãã§ããŸãã Scalaã§ã¯ãä»»æã®æåã·ãŒã±ã³ã¹ã䜿çšã§ããŸãã ããïŒ
ïŒ>ããšãã+ïŒ>ãã®éããæ¬åœã«ç¥ãå¿
èŠããããŸããïŒ
- ã³ã³ãã€ã«æéãé
ãã
ãæž
èŽããããšãããããŸããã
ãªãªãžãã«Scala察Kotlin
PS翻蚳ã®ããã€ãã®å Žæã§ã¯ãç¹ã«ç¿»èš³ãªãã®åèªãæ®ããŸããïŒnullãnull safeãinfixãpostfixãªã©ïŒã