มาเรียนรู้ Kotlin ที่งาน Kotlin Workshop กันเถอะ
สวัสดีทุกท่าน เราก็เป็น Android Developer มาพักนึงแล้ว และได้ตามข่าว Google I/O 2017 ซึ่งภาษา Kotlin จะเป็นภาษา Official อีกภาษานึง ที่ไว้เขียน Android Application เราได้ตามข่าวใน Thailand Kotlin Developer Group และเขาก็กำลังจะจัดงาน Kotlin Meetup ครั้งที่ 3 แล้วสำหรับงาน Kotlin Workshop พอได้เวลากดบัตร ก็รีบกดกัน ที่ออฟฟิคกดบัตรสามคน ...................... เราได้คนเดียวจ้าาา โอ้ยยยย แปปเดียว บัตรหมดไวไปนะเออ (และงานที่แจกบัตรผ่าน eventpop ทุกงาน มันหมดไวมาก แบบวินาทีเดียวก็หมดแล้ว หัวร้อนกันไปหมด ดีที่บางงานมีเพจกูโค้ดไปไลฟ์นะ)
การเตรียมตัว
- นำคอมพิวเตอร์ที่ใช้ทำงาน ลง plug-in kotlin ตามในลิ้งที่เขาให้มา
เรามาสรุปสั้นๆกันดีกว่า อันนี้สำหรับคนใช้ mac แล้วกันเนอะ (ทอดทิ้งคนใช้ windows แปปนึง)
กด Android Studio ตรงด้านบน เลือก Preference หรือกดคีย์ลัด command+,
เลือกแท็บ Plugins พิมพ์ Kotlin และ install ลงไป
จากนั้นเราก็จะพบคุณ Kotlin ที่เราดาวน์โหลดเสร็จแล้ว แบบนี้ จากนั้น restart android studio ซะ
เวลาเราจะสร้างไฟล์ใหม่ในโปรเจกเรา เราก็จะเห็น Kotlin File/Class ถือว่าเรา install plug-in เสร็จบริบูรณ์
งานนี้จัดขึ้นที่ Pronto Marketing ลง BTS สะพานควาย แล้วนั่งวินหรือเดินเอา แบบนี้ เดินไปเรื่อยๆ เปิด google map แล้วเดินตามเอา อยู่ที่ซอยประดิพัทธ์ 19 ในซอยมี ...... ช่างมันเถอะ เลยไปนิดนึงเป็นตึก อยู่ในตึกนั้นแหละ ชั้น 3
Agenda โดยรวมของงาน งานจัดขึ้นวันเสาร์ที่ 19 สิงหาคม 2560 จ้าาา
13:00 Register
13:30 Introduction to Kotlin
14:00 Workshop: Kotlin for Android
15:00 Break
15:20 Workshop: Miracle of stdLib
16:20 Non-JVM Kotlin
17:00 Prepare to go home
มาดูกันดีกว่า ว่าการ workshop นี้ จะสนุกสนานขนาดไหนกันน
ก่อนอื่นเตรียมตัวลง plug-in กันก่อน ซึ่งวันที่ workshop kotlin 1.1.4 ออกมาได้แค่อาทิตย์เดียวเอง และใช้ร่วมกับ Android Studio 3 ซึ่งเอาจริงๆเราใช้เวอร์ชั่น 2.3.3 ก็ใช้ได้เหมือนกันนะเออ ดังนั้นก็ update gradle ด้วยนะเออ
และสไลด์ทั้งหมด อยู่ที่
https://drive.google.com/drive/folders/0B2348tIBJgafR2EtdHlhdDZmYVU
คำนิยามโดยย่อของแต่ละ session สนุกกันไปคนละแบบ
1) Introduction to Kotlin : ทำความรู้จักกับ kotlin
2) Workshop: Kotlin for Android : แปลง JAVA ให้เป็น Kotlin ใน Android Studio
3) Workshop: Miracle of stdLib : มาทำความรู้จักการใช้ algorithm ใน kotlin เพิ่มเติม
4) Non-JVM Kotlin : kotlin ไม่ได้ทำได้แค่ Android app อย่างเดียวนะ ทำอย่างอื่นได้มากกว่าที่เราคิด
มาเริ่มกันดีกว่าเนาะ
Introduction to Kotlin
โดยคุณแอร์ จาก Agoda
ใน session แรกจะเป็นการเรียกนํ้าย่อยก่อนลงสู่สนาม Kotlin จริง แนะนำให้รู้จักกับน้อง Kotlin กันก่อน Kotlin พัฒนาโดย Jetbrain รันบน JVM รองรับ static type ที่สำคัญ สามารถทำงานร่วมกันกับ JAVA ได้
โดยปกติเราเป็น Android Developer จะเขียนแอปด้วยภาษา JAVA ดังนั้นจะเปรียบเทียบภาษา JAVA กับ Kotlin ให้ดูกันเห็นๆเลย โดยสรุปก็คือเจ้า Kotlin จะเขียนโค้ดได้สวยกว่า ง่ายกว่า ดังนี้
1. มีตัวแปรสองประเภทใหญ่ๆ คือ
Mutable : เปลี่ยนแปลงค่าได้
var name: String = “Kotlin”
Immutable : เปลี่ยนแปลงค่าไม่ได้
val name: String = “Kotlin”
จุดสังเกต
- Mutable ก็เหมือนตัวแปรที่เราประกาศตามปกติ สามารถยัดค่าอื่นเข้าไปแทนค่าเดิมได้ การประกาศตัวแปรจะใช้
var
- Immutable ก็เหมือนเราประกาศ
final
ไว้หน้าตัวแปร เพื่อประกาศค่า constant ที่ใช้ซึ่งไม่สามารถเปลี่ยนค่าได้ การประกาศตัวแปรใช้val
- การประกาศ class ใน kotlin ไม่ต้องใช้ new เพื่อสร้าง object class ให้กับตัวแปรนั้นๆ
2. การประกาศ class ของ kotlin แค่ใส่ variable ที่เราจจะใช้ ไม่ต้องใส่ set
กับ get
เนื่องจากตัว kotlin เขามีตัวจัดการเรื่องพวกนี้อยู่แล้ว การใช้ set กับ get ใน kotlin ก็ไม่ต้องใส่อะไรมากมายเลย ใช้เหมือนกันทั้ง get และ set เลย แค่เรียกใช้ตัวแปรใน class ก็เพียงพอแล้ว
3. ถ้าในกรณีที่เราไม่ได้ get หรือ set ตรงๆ เช่น เอาค่ามาทำการคำนวณ การเปลี่ยนแปลงสตริง ใน JAVA ก็ทำใน get กับ set เลย แล้วใน kotlin หล่ะ ทำใน get และ set เหมือน JAVA นั่นแหละ แต่จะใช้ get()
และ set(value)
แบบสั้นๆ และอีกอย่าง การใส่ค่าสตริง เราใส่ “blah blah” + value ใช่ม๊าา ใน kotlin ทำง่ายๆ แค่ใส่ $
หน้าชื่อตัวแปร
4 ใน kotlin ไม่สามารถประกาศตัวแปรโดยไม่ assign ค่าให้มันไม่ได้
แต่ถ้าอยากจะ assign ค่าทีหลังจริงๆ ใช้ late init ช่วย โดยใส่ lateinit
ไว้ว่าตัวแปรที่เราต้องการ จากนั้นเราจึงจะ assign ค่าทีหลังได้
แต่ๆๆๆๆๆ เรานำตัวแปรที่ยังไม่ได้ assign ค่าไปใช้ไม่ได้นะเออ ซึ่งมันก็ make sense นะ
5. lazy
คือการ save memory แล้วเรียกใช้หน่วยความจำเมื่อมีการเรียกใช้ตัวแปรนั้นๆ โดยใส่ by lazy
ไว้หลังตัวแปรที่เราต้องการ เช่น เราสร้าง database ไว้ตัวนึง แล้วเราให้ save ชื่อไว้ใน database วึ่งจะทำงานตอนที่เรา save ค่านั่นแหละ
6. Nullable type ใน kotlin นางจะคืนค่าที่ไม่เป็น null ออกมา ดังนั้นถ้าเราจะให้ตัวแปรสามารถคืนค่า null ออกมาได้ ดังนั้นเราต้องใส่ ?
ไว้หลังประเภทตัวแปร เช่น String? สามารถคืนค่า String และ null ได้
ดังนั้นการที่เราจะ check ว่าค่าที่เข้ามาเป็น null หรือเปล่า ใน JAVA ต้อง check if object != null
ใช่ป่ะ แต่ใน kotlin สามารถทำเสร็จได้ในบรรทัดเดียว โดยไม่ใช้ if อาจจะเถียงได้ว่า JAVA มันก็ใช้ if แบบย่อได้นะยูววว มาดูกันดีกว่าค่ะ ให้คนอ่านตัดสิน (เพราะทั้งงานนั้น บอกว่าเลิกเขียน JAVA ให้มาเขียน kotlin แทน)
JAVA: return name != null ? Name.toUpperCase() : null;
Kotlin: return name?.toUpperCase()
ถ้า return ค่าอื่นแทน null ในกรณี else ก็ทำได้เช่นกัน โดยใช้ elvis operator ผู้ที่คล้ายทรงผมของเอลวิส ได้เช่นกัน โดยใส่ต่อหลัง แล้วตามด้วยค่าอื่นที่เราต้องการ เช่น เราต้องการให้ string ที่มีเป็นตัวพิมพ์ใหญ่หมด ถ้า name มันเป็น null สามารถให้มัน return ออกมาเป็น empty string ได้
ส่วน assertion ยังงงๆอยู่...ในตอนนั้น ก็คือใส่ไปเพื่อยืนยันว่า มันไม่ null เว้ย ซึ่งจริงๆอาจจะ null ก็ได้
7. การทำ constructor ไม่ต้องทำอะไรยุ่งยาก ตัว constructor block ไว้บนสุดเลย และเราประกาศ initialize ภายใต้ init
8. การประกาศ function เราใช้ fun
นำหน้าชื่อ function นะ ใน Kotlin เราจะไม่ประกาศ permission public protected และ private ไว้หน้าตัวแปร และสามารถย่อให้เหลือสั้นๆเพียง 1 บรรทัดเท่านั้น
การเรียกใช้ function ค่อนข้าง flexible สุดๆ สามารถใส่ชื่อตัวแปรเท่ากับค่าได้เลย อีกทั้งไม่ต้องเรียงตามลำดับ order ให้วุ่นวาย ใส่ให้ครบตามลำดับเหมือนทุกๆภาษา ตัว function สามารถ set ค่า parameter เป็นค่า default ได้ด้วยนะ
9. lambda คือการที่เราเขียนแบบย่อๆ โดยใส่ type และสิ่งที่เราต้องการจะทำ การใช้ก็ใส่ค่า parameter ตามที่เราต้องการได้เลย ซึ่งรายละเอียดแบบเข้าใจง่ายจะอยู่ใน session ที่สองนะ
10. higher order function เรียกภาษาชาวบ้าน คือ function ซ้อน function นั่นเอง
ซึ่งสามารถทำ map คือการ transform แต่ละอันรวมเป็น data ก้อนเดียวกัน ซึ่งใน kotlin จะใช้ listOf
แล้วตามด้วย object
ที่เราจะ transfer เดินไปด้วยกัน ไม่ต้องสร้าง List หรือ ArrayList ใหม่ เพื่อเก็บแต่ละอย่างใน list ใหม่ที่เราสร้างขึ้น แล้วเข้า map
ความพิเศษ คือ ถ้าเราอยาก check ว่า object แต่ละตัว มีค่าเท่ากันไหมมมม เราอาจจะต้องวน loop เพื่อ check ค่าภายใน ใน kotlin สามารถเอามา check ได้ทันที ไม่ต้องวน loop (ซึ่งไม่มีตัวอย่างไม่มีสไลด์)
11. Data class ไม่ต้อง Override function อื่นๆมาให้เสียเวลา เอ้ออ ไม่ต้องใส่ get กับ set ใส่แค่ตัวแปรใน class พอ
Workshop: Kotlin for Android
โดยคุณดิว จาก Yesmom ซึ่งเราก็มี blog ใน medium ชื่อว่า blacklens ในนั้นมีเทพ Kotlin หลายท่านเลย
ต่อมากับ session ที่สอง มาเปลี่ยน JAVA เป็น Kotlin
ก่อนที่จะเริ่ม clone โปรเจกก่อนนะเออ https://github.com/ThaiKotlinDev/task-universe branch master นะยูวว อันที่เสร็จแล้วจะอยู่ที่ completed นะ ไว้ตรวจคำตอบ
ที่เราจะทำคือแอปประมาณนี้ หน้าแรกทำด้วย RecyclerView สามารถกดไปหน้าอื่นได้ แบบง่ายๆ โดยแปลงโค้ดในโปรเจกนี้เป็น Kotlin
ตรวจสอบ plug-in ก่อนว่าเป็น version ล่าสุด โดยไปที่ Tools -> Kotlin -> Configure Kotlin in Project
คลิกที่ All modules containing Kotlin files และเวอร์ชั้นตอนนี้ คือ 1.1.4-2 นะเออ
มีเป็น video ด้วยนิดนึง
ในขั้นแรก จะเริ่มแปลง JAVA เป็น Kotlin โดยเริ่มจาก model class สร้างไฟล์ Kotlin โดยกด command + n
ชื่อเดียวกับ model class จากนั้นก็อปของข้างในมา ครอบทั้งหมดตั้งแต่ประกาศ class มาเลย paste ใน kotlin ไฟล์ เขาถามว่าจะให้แปลงเป็น kotlin เลยไหม กด OK เลยจ้า
และผลที่ได้ โอโห้ class model สั้นลงไปมาก
เนื่องจากมันเป็น model class เนอะ ค่าที่เข้ามามันจะไม่เปลี่ยนค่า ดังนั้นเปลี่ยน var -> val
และค่าที่เข้ามามันไม่เป็น null ดังนั้นเอา ? ออกไป
จากประสบการณ์ พบว่า มันแล้วแต่ Requirement แล้วกันเนอะ บางทีอาจจะเผื่อ null ด้วยก็ได้ ไม่งั้นแอพแคลช
แล้วก็ลบ JAVA เดิมด้วยนะ กัน compiler สับสน
ถ้างงว่าครอบตรงไหน เชิญวิดีโอจ้าา
ตัวโปรเจกจะมีการ uncomment ที่ gradle เพื่อเราสามารถเขียนได้เมามันส์ขึ้น แต่ก็ไม่แนะนำทุกกรณีนะ (เพราะบางอย่างมันก็ไม่ควรใช้บน production เว้ยยย)
เรามีวิธีใช้กระดาษทดแบบง่ายๆ คือการทดลองการเขียนโค้ดด้วย Kotlin ว่าท่านี้เขียนถูกไหม
โดยไปที่ Tools -> Kotlin -> Kotlin REPL
มันจะอยู่ข้างล่างนะเน้ออ
ใน comment มันคืออะไร มันคือ การประกาศ object แล้วใส่ค่าลงไปง่ายๆนี่แหละ
เริ่มที่การลองใส่ค่าใน mutable list และใส่ค่าเพิ่มลงไป
คราวนี้มาลองการใช้ lambda กันดีกว่า
เราสร้าง function myFunc เพื่อรับตัวเลขเข้ามา และคืนค่าตัวเลขออกมา
ลองอีกอัน เราใส่ตัวเลขไปสองตัว นำมาเปรียบเทียบกัน ผลจะออกมาเป็นอะไร
ผลออกเป็น falsetrue เพราะอะไรหล่ะ เพราะคืนค่าทุกอันที่เปรียบเทียบใน list นั้น
ทดลองแลมด้ากันพอหอมปากหอมพิซซ่า เอ้ยยย หอมคอไปแล้ว มาถึงช่วงแปลงเป็น Kotlin ต่อ
ที่ต่อไปที่เราจะเปลี่ยน TaskRepositorImpl
โดยสร้าง kotlin ไฟล์ขึ้นมาใหม่ ชื่อว่า KotlinTaskRepositorImpl
จากนั้นก็อปของจาก TaskRepositoryImpl มา ระหว่างนี้มันจะ build ไม่ผ่าน เราต้อง import library kotlin file ที่เราสร้างมาก่อน
อันนี้อาจจะงงๆว่าควรจะก็อปใส่ยังไงดี ดูวิดีโอเลยจ้าา
ลอง run ดู จะขึ้นมาเป็น RecyclerView ที่เป็น list ยาวๆ
บางคนอาจจะรันขึ้นไม่ได้ ให้ uncomment ที่ Presentation > di > Injector แล้ว import library ให้เรียบโร้ยยยยยย
ไปที่ TaskListActivity
เพื่อ uncomment ตรง intent เพื่อให้ไปอีกหน้านึงตอนคลิกได้
ต่อมาไปอีกสองหน้าอีกนิดๆหน่อย ดังรูป
ไปที่ Presentation > taskdetails > TaskDatailsActivity
มี TODO 4 จุดที่ต้องทำ เนื่องจากเวลามีน้อยเลยเหลือแค่ 3 อัน
TODO #1 : เป็นการรับ bundle มาจาก activity ที่แล้ว
TODO #2 : เป็นการใส่ title description และรูปภาพ การใช้ library glide ท่าจะคล้ายๆใน JAVA เลย
และ set adapter ซึ่งเราจะไปแก้ที่ ActionItemAdapter อีกที่นึง
TODO #3 : อันนี้ใส่รูป
TODO #4 : เป็นการ set recycler view ซึ่งเราไม่ต้องมาใส่ mRecyclerView. บลาๆๆๆ สามารถใช้ apply ครอบเพื่อระบุคุณสมบัติได้
และไปที่ Presentation > taskdetails > ActionItemAdapter เพื่อทำ adapter ซึ่งก็ตรงไปตรงมา
TODO #1 : คืนค่า size ทั้งหมดออกมา โดยค่าที่ได้ต้องไม่ใช่ null นะเออ
TODO #2 : bind view ออกมาโดยอิง position
TODO #3 : เป็นการใส่ attribute
บางทีอาจจะมีขึ้นแดงๆ เนื่องจากเราเพิ่ม LayoutContainer แล้วยังไม่ได้ implement ไส้ในของ function ของ LayoutContainer นั่นเองงงง
ระหว่างนี้มีคั่นด้วยเบรกและพิซซ่าเบาๆ
แอบเสียดายเวลาน้อยไปนิดดด ตอนแรกดูพี่ดิวไปทำไป จนเปลี่ยนมาทำพร้อมกันเพื่อประหยัดเวลา
Workshop: Miracle of stdLib
โดยคุณป็อปจาก shopspot และคุณจูจาก Agoda
เช่นเดิม clone code ทั้งหมดจาก https://github.com/ThaiKotlinDev/miracle-of-stdlib
มาเรื่องแรก apply
, also
, with
รู้สึกว่าจะแอบข้ามสไลด์ มาดูตัวอย่างในนี้
initTextViewBad
อันนี้คือ JAVA style
initTextViewWith
อันนี้ดีขึ้นนิดนึง มาการครอบโดยใช้ with
และใส่ค่าที่จะ return แต่ยังไม่ดีที่สุด
initTextViewGood
ใช้ apply
ครอบเหมือนด้านบนเลย
initTextViewGood2
ใช้ also
ครอบ แล้วใช้ it
ซึ่ง it ก็คือมัน หมายถึงตัวมันนะ
ซึ่งอัน Good แล้วแต่ถนัดเลย
เรื่องต่อมา let
, run
ทำให้เราไม่ต้องมานั่ง check null ให้ยุ่งยาก จบได้ใน line เดียว
อันนี้เป็นการเรียก API ซึ่งเราต้อง check ค่าที่รับมาเนาะ ว่า response ต้องไม่เป็น 404 not found และไม่เป็น null
อันนี้ก็ check ค่าที่เข้ามาว่าผลเป็น null หรือไม่
วิธีจำง่ายๆ let
ใช้กับ it
และ run
ใช้กับ this
นะ
เรียนสักแปป quiz 1 ก็มาไม่ทันตั้งตัว เหมือนเติมคำในช่องว่างตามโจทย์
ถ้าจะดูว่าโค้ดเราเขียนถูกไหม สามารถไป run unit test ในนั้นได้เลย
ขอแปะโจทย์พร้อมเฉลย ดังนี้
quiz 1 ลองเอาข้างบนมาแปลงเป็น Kotlin
ต่อมาก็เรื่อง lazy จะเริ่มใช้ memory ตอนทำงาน ตามข้างต้น
ตอนต้นบอกได้ว่านางมี 2 type เนอะ
เราสามารถ add remove list ได้ตามใจชอบ ซึ่งมันจะคล้ายๆ list ใน python เลยแหละ
แถมใช้ function พวกนี้แบบง่ายๆ ทั้งในเรื่อง
เรื่อง set ก็เล่นง่ายเหลือเกิน แม่งง่ายกว่า python อีกอ่ะ เรียกกันตรงๆเลย
(อ้างอิงจากที่เราทดลองและเขียนเล่น https://mikkipastel.com/set-in-the-python/)
data model ก็ง่ายๆ เราสามารถใส่ default หรือ init อันนี้ไม่แน่ใจนะ ได้ด้วยแล้วกัน (ตอนนี้รู้แล้ว ก็คือเราสามารถ init ค่า default ใน model ได้เลย)
ตัวอย่างการใช้งาน เช่น การ sort หาข้อมูลที่เราต้องการมาตัวนึง
quiz 2 ก็มาตบท้าย โจทย์คือให้เรา filter ข้อมูลตามโจทย์ที่กำหนดให้
ตรวจสอบด้วย unit test เหมือนเดิม แต่เขาเขียน test ผิดไปนิดนุงง
Non-JVM Kotlin
โดยคุณเบ็บจาก Genxas Elite ซึ่งเขาก็มี blog ใน blacklens ด้วยเช่นกัน
หัวข้อนี้พูดถึงการเขียน kotlin ไปใช้ที่อื่นนอกจาก android
เช่น การเอาไปเขียนหน้าเว็บ มันจะสามารถ convert kotlin ไป js ได้ โดยการไป setting ใน gradle (kotlin.js) และ pack file ทั้งหมดที่ compile เสร็จแล้ว ไป deploy ซึ่งพอเปรียบเทียบโค้ดแล้ว หน้าตาเหมือน js เลยเนอะ หน้าตาคุ้นมากตั้งแต่ session แรก แถมไม่มี ; เหมือน python อีก
พอแปลงแล้วโค้ดก็จะเป็นประมาณนี้
session นี้ไม่ได้ workshop จริงจัง แค่โชว์ให้ดูเฉยๆ
โค้ดที่ใช้ clone จาก https://github.com/ThaiKotlinDev/kotlinjs-wonderland
ลง editor IntelliJ IDEA CE ในการกระทำครั้งนี้ ไม่ต้องมี Android Studio ก็สามารถเขียนโค้ดด้วย Kotlin ได้
มีการใส่ gradle คล้ายๆใน Android Project ด้วย เพิ่ม apply plugin: "kotlin2js"
ด้วยนะ
มี library ให้เรียกใช้ พี่เขาก็ก็อปแปะรันให้เราดูว่าผลออกมาเป็นยังไง
Dynamic type สามารถไปเรียก firebase ได้ด้วยนะ
External ต้องใส่ modifer ว่าเราไปเรียกฟังก์ชั่นนี้ด้านนอกแล้วนะ
ตัวเว็บของกลุ่มก็ใช้ Kotlin เขียนขึ้นมาทั้งหมด https://thaikotlindev.github.io/
กลุ่มเป้าหมายของ Non-JVM ซึ่งเราเขียน Kotlin แล้วแปลงเป็นภาษาตาม platform นั้นๆ ได้แก่ Embedded system/IoT, iOS, Windows, Web Assembly
มีคนเอาไปใช้กับ RaspberryPi เหมือนกันนะเออ
โดยของ iOS จะแปลง kotlin ไปเป็น C++ แล้วเปลี่ยนไปเป็น Objective-C และจบที่ Swift
และมีการโชว์ให้ดูด้วย โดยมี reference ตามนี้ http://justmaku.org/2017-06-07-kotlin-on-ios
ซึ่งก็รันได้จริงๆนะเออ นึกถึง react.js เหมือนกันนะ
ซึ่งถ้าเราอยากเอา Kotlin ไปเขียนหน้าเว็บงี้ ตามไปอ่านได้ที่นี่เลย
สุดท้ายขอบคุณ Thailand Kotlin Developer ที่จัดงานนี้นะคะ
และรูปจากคุณ Wanchuda Sukarrom ที่ถ่ายภาพเก็บตกของงานนะคะ
ส่วนรูปด้านบนจากแอดมินกรุ๊ปค่ะ คุณ Verachad Wongsawangtham ทำท่าเป็นรูปตัว K สดๆกันเลยทีเดียว
ส่วนเว็บของกลุ่ม https://thaikotlindev.github.io/ ใช้ kotlin ทำทั้งหมดเลย
และ GitHub https://github.com/ThaiKotlinDev
ลองเล่น kotlin แบบชิวๆที่ https://try.kotlinlang.org
และเขามี library document ด้วย เป็นของ version 1.1 เลย ที่เราเปิดค้างไว้ก็อันนี้ https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/index.html ตอน session ที่ 3 จ้าาา
และสุดท้าย official document อยู่ที่ https://kotlinlang.org/docs/kotlin-docs.pdf
ถ้าข้อมูลส่วนไหนผิดพลาดก็ขออภัยด้วยนะคะ
สามารถติติงได้เพื่อข้อมูลที่ถูกต้องค่ะ :)