'J[[#V[[
for (i in 1..100) {
val result =
if (i % 15 == 0) "FizzBuzz"
else if (i % 3 == 0) "Fizz"
else if (i % 5 == 0) "Buzz"
else i.toString()
println(result)
}
Slide 19
Slide 19 text
'J[[#V[[
for (i in 1..100) {
val result =
if (i % 15 == 0) "FizzBuzz"
else if (i % 3 == 0) "Fizz"
else if (i % 5 == 0) "Buzz"
else i.toString()
println(result)
}
+BWBͰ͍͏ͱ͜Ζͷ
֦ுGPSจͷΈ
3BOHF
ΦϒδΣΫτ
Slide 20
Slide 20 text
'J[[#V[[
for (i in 1..100) {
val result =
if (i % 15 == 0) "FizzBuzz"
else if (i % 3 == 0) "Fizz"
else if (i % 5 == 0) "Buzz"
else i.toString()
println(result)
}
ܕਪ
pOBM4USJOHSFTVMUʜ
Slide 21
Slide 21 text
'J[[#V[[
for (i in 1..100) {
val result =
if (i % 15 == 0) "FizzBuzz"
else if (i % 3 == 0) "Fizz"
else if (i % 5 == 0) "Buzz"
else i.toString()
println(result)
}
JGFMTFࣜ
Λฦ͢
Slide 22
Slide 22 text
ͦͷ
,PUMJOͰؔܕϓϩάϥϛϯά
Slide 23
Slide 23 text
͕ؔpSTUDMBTT
val add = {
(a: Int, b: Int) -> a + b
}
!
val add2 = add
add2(3, 4) /
/ => 7
Slide 24
Slide 24 text
͕ؔpSTUDMBTT
val add = {
(a: Int, b: Int) -> a + b
}
!
val add2 = add
add2(3, 4) /
/ => 7
ؔϦςϥϧͰ
ؔΛੜͯ͠
มʹೖ
ී௨ͷมͷ
Α͏ʹѻ͑Δ
Slide 25
Slide 25 text
͕ؔpSTUDMBTT
val add = {
(a: Int, b: Int) -> a + b
}
!
val add2 = add
add2(3, 4) /
/ => 7
ී௨ͷؔݺͼग़͠
ͷΑ͏ʹهड़Ͱ͖Δ
Slide 26
Slide 26 text
ߴ֊ؔ
val predicate = {
(i: Int) -> i % 2 != 0
}
list.filter(predicate)
Slide 27
Slide 27 text
ߴ֊ؔ
val predicate = {
(i: Int) -> i % 2 != 0
}
list.filter(predicate)
Ҿ͕حͳΒ
USVFͱͳΔड़ޠ
ड़ޠͰͬͯ
ϑΟϧλϦϯά
ΠϯϥΠϯؔ
val r = list.filter {
it % 2 != 0
}
inline fun filter(p: (T)->Boolean) { … }
Slide 33
Slide 33 text
ΠϯϥΠϯؔ
val r = list.filter {
it % 2 != 0
}
ྫ͑
val list_ = arrayListOf()
for(e in list) if(e % 2 != 0) list_.add(e)
val r = list_
ΠϯϥΠϯల։͞ΕΔ
Φʔόϔουݮ
inline fun filter(p: (T)->Boolean) { … }
Slide 34
Slide 34 text
ඌݺग़͠࠷దԽ 5$0
tailRecursive
fun sum(ints: List, s: Int = 0): Int
= if(ints.none()) s
else sum(ints.tail, s + ints.first())
UBJM3FDVSTJWFΞϊςʔγϣϯ
ඌͷ࠶ؼݺग़͠Λɺϧʔϓͱͯ͠
ίϯύΠϧͯ͘͠ΕΔ
Slide 35
Slide 35 text
ͦͷ
,PUMJOͰΦϒδΣΫτࢦ
Slide 36
Slide 36 text
Ϋϥε
class Greeter
!
val greeter = Greeter()
Slide 37
Slide 37 text
Ϋϥε
class Greeter
!
val greeter = Greeter()
࠷খͷ
Ϋϥεఆٛ
ΠϯελϯεԽ
OFXෆཁ
Slide 38
Slide 38 text
ϝιου
class Greeter {
fun greet() {
println("Hello")
}
}
Slide 39
Slide 39 text
ϝιου
class Greeter {
fun greet() {
println("Hello")
}
}
ݺͼग़͠ํ
HSFFUFSHSFFU
Slide 40
Slide 40 text
ϓϩύςΟ
class User(name: String) {
var name: String = name
}
!
val user = User("Taro")
user.name /
/ => "Taro"
Slide 41
Slide 41 text
ϓϩύςΟ
class User(name: String) {
var name: String = name
}
!
val user = User("Taro")
user.name /
/ => "Taro"
ίϯετϥΫλ
ϓϩύςΟ
Slide 42
Slide 42 text
ϓϩύςΟ
class User(name: String) {
var name: String = name
}
!
val user = User("Taro")
user.name /
/ => "Taro"
ϑΟʔϧυʹ
ΞΫηε͍ͯ͠Δ෩
Slide 43
Slide 43 text
ΞΫηα
class User(name: String) {
var name: String = name
set(name: String) {$name = name }
get(): String = $name
}
Slide 44
Slide 44 text
ΞΫηα
class User(name: String) {
var name: String = name
set(name: String) {$name = name }
get(): String = $name
}
ϓϩύςΟ໊
CBDLJOHpFME
Slide 45
Slide 45 text
%FMFHBUFE1SPQFSUZ
class User(name: String) {
val name: String by Decorator(name)
}
!
class Decorator(val str: String) {
fun get(thisRef: Any,
prop:PropertyMetadata): String = "˒$str˒"
}
Slide 46
Slide 46 text
%FMFHBUFE1SPQFSUZ
class User(name: String) {
val name: String by Decorator(name)
}
!
class Decorator(val str: String) {
fun get(thisRef: Any,
prop:PropertyMetadata): String = "˒$str˒"
}
6TFSOBNFͷ
ΞΫηε͕ҕৡ͞ΕΔ
Slide 47
Slide 47 text
ܧঝ
open class Foo {
fun foo(): String = "foo"
}
!
class Bar: Foo()
!
Bar().foo() /
/ => foo
Slide 48
Slide 48 text
ܧঝ
open class Foo {
fun foo(): String = "foo"
}
!
class Bar: Foo()
!
Bar().foo() /
/ => foo
PQFOඞਢ
σϑΥϧτͰܧঝෆՄ
&⒎FDUJWF+BWB
߲ܧঝͷͨΊʹઃܭٴͼจॻԽ͢ΔɺͰͳ͚
ΕܧঝΛېࢭ͢Δ
Slide 49
Slide 49 text
τϨΠτ
trait A {
fun hoge() = "A"
fun fuga(): String
}
!
class Sample: A {
override fun fuga() = "Sample"
}
Slide 50
Slide 50 text
τϨΠτ
trait Hoge {
fun hoge() = "A"
fun fuga(): String
}
!
class Sample: Hoge {
override fun fuga() = "Sample"
}
GVHB
࣮ඞਢ
PWFSSJEFΞϊςʔγϣϯ
Slide 51
Slide 51 text
τϨΠτ
trait Hoge {
fun hoge() = "A"
fun fuga(): String
}
!
class Sample: Hoge {
override fun fuga() = "Sample"
}
σϑΥϧτ࣮Λ
࣋ͯΔ
Slide 52
Slide 52 text
ଟॏܧঝ
trait A { fun a() = "A" }
trait B { fun a() = "B" }
!
class C: A, B {
override fun a() = super.a()
}
ҕৡ
class Data(val value: String)
!
trait Dao {
fun save(data: Data)
}
!
class Service(dao: Dao): Dao by dao {
fun createData(value: String) {
val data = Data(value)
save(data)
}
}
Slide 55
Slide 55 text
ҕৡ
class Data(val value: String)
!
trait Dao {
fun save(data: Data)
}
!
class Service(dao: Dao): Dao by dao {
fun createData(value: String) {
val data = Data(value)
save(data)
}
}
ܕܧঝ͢Δʂ
࣮ҕৡ͢Δʂ
,PUMJOͰ୯७ͳ"DUJWJUZ
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Slide 67
Slide 67 text
ϏϡʔΛर͍͍ͬͯ͜ͱ͢Δ
val button: Button? = findViewById(R.id.button)
if (button != null) {
button.setText("Click me")
}
Slide 68
Slide 68 text
ϏϡʔΛर͍͍ͬͯ͜ͱ͢Δ
val button: Button? = findViewById(R.id.button)
if (button != null) {
button.setText("Click me")
}
ܕ
Slide 69
Slide 69 text
/VMM҆શ
val n: Int = null
,PUMJOͰσϑΥϧτͰOVMMېࢭ
ίϯύΠϧΤϥʔ
Slide 70
Slide 70 text
/VMM҆શ
val n: Int? = null
OVMMΛड͚औΔʹ
OVMMڐ༰ܕͰ͋Δ͜ͱΛ໌ࣔ͢Δ
Slide 71
Slide 71 text
/VMM҆શ
val a: Int = null /
/ OK
val b: Int? = null /
/ NG
b.toString() /
/ NG
if(b != null) b.toString() /
/ OK
b?.toString() /
/ OK
Slide 72
Slide 72 text
/VMM҆શ
val a: Int = null /
/ OK
val b: Int? = null /
/ NG
b.toString() /
/ NG
if(b != null) b.toString() /
/ OK
b?.toString() /
/ OK
if (b != null) b.toString()
else null
7JFXͷ*OKFDUܥπʔϧ
w "OESPJE"OOPUBUJPOTͳͲͷ"15
,PUMJOͰ͑ͳ͍
w 3PCP(VJDFͳͲͷϦϑϨΫγϣϯܥ
,PUMJOͰ͑Δ
Slide 78
Slide 78 text
%FMFHBUFE1SPQFSUZ࠶ͼ
class User(name: String) {
val name: String by Decorator(name)
}
!
class Decorator(val str: String) {
fun get(thisRef: Any,
prop:PropertyMetadata): String = "˒$str˒"
}
Slide 79
Slide 79 text
Ԡ༻ྫ7JFXͷ*OKFDU
class MainActivity: Activity() {
val submitButton: Button by injector()
!
fun onCreate(savedInstanceState: Bundle?) {
submitButton.setOnClickListener(::submit)
}
}
Slide 80
Slide 80 text
͓·͚
,PUMJOͰ̋̋
Slide 81
Slide 81 text
,PUMJOͰ#%%ελΠϧͷςετ
class TaxCalculatorSpecs: Spek() {{
!
given("Tax rate calculator with default locale settings") {
val taxRateCalculator = TaxRateCalculator()
on("calculating the rate for an income of 200 and an average change of 10 per semester") {
val value = taxRateCalculator.calculateRate(200, 10)
it("should result in a value of 300") {
assertEquals(300, value)
}
}
}
}}
ςετϑϨʔϜϫʔΫ!
Spek
http://jetbrains.github.io/spek/ΑΓҾ༻
Slide 82
Slide 82 text
,PUMJOͰ8FCΞϓϦ
w ͪΖΜී௨ͷαʔϒϨοτΛॻ͚Δ
w 8BTBCJ4JOBUSBΠϯεύΠΞܥ
w ,BSB)5.-
$44,PUMJOͰ
w /PEFLU/PEFKTͬΆ͍ͭ
Slide 83
Slide 83 text
,PUMJOͰ8FCΞϓϦ
w ͪΖΜී௨ͷαʔϒϨοτΛॻ͚Δ
w 8BTBCJ4JOBUSBΠϯεύΠΞܥ
w ,BSB)5.-
$44,PUMJOͰ
w /PEFLU/PEFKTͬΆ͍ͭ
8BTBCJҎ֎
΄΅ߋ৽͞Εͯͳ͍
Slide 84
Slide 84 text
,PUMJOͰ+BWB4DSJQU
w +BWB4DSJQUͷίϯύΠϧՄೳ
https://speakerdeck.com/ntaro/tian-xia-
altjswu-dao-hui-kotlin-number-
tenka1altjs
ఱԼҰaltJSಓձ Kotlin