วันจันทร์ที่ 28 สิงหาคม พ.ศ. 2560

มาเรียนรู้ 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 ผู้ที่คล้ายทรงผมของเอลวิส ได้เช่นกัน โดยใส่ต่อหลัง แล้วตามด้วยค่าอื่นที่เราต้องการ ส่วน assertion ยังงงๆอยู่...

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

รูปออฟฟิคเดิมของ shopspot ตอนนี้เป็นของฟังใจไปแล้ว ;P

ตรวจสอบ 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 ดังนั้นเอา ? ออกไป


แล้วก็ลบ JAVA เดิมด้วยนะ กัน compiler สับสน

ถ้างงว่าครอบตรงไหน เชิญวิดีโอจ้าา


ตัวโปรเจกจะมีการ uncomment ที่ gradle เพื่อเราสามารถเขียนได้เมามันส์ขึ้น แต่ก็ไม่แนะนำทุกกรณีนะ


เรามีวิธีใช้กระดาษทดแบบง่ายๆ คือการทดลองการเขียนโค้ดด้วย 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
quiz 1 unit test




ต่อมาก็เรื่อง lazy จะเริ่มใช้ memory ตอนทำงาน ตามข้างต้น


ตอนต้นบอกได้ว่านางมี 2 type เนอะ
เราสามารถ add remove list ได้ตามใจชอบ ซึ่งมันจะคล้ายๆ list ใน python เลยแหละ


แถมใช้ function พวกนี้แบบง่ายๆ ทั้งในเรื่อง


เรื่อง set ก็เล่นง่ายเหลือเกิน แม่งง่ายกว่า python อีกอ่ะ เรียกกันตรงๆเลย
(อ้างอิงจากที่เราทดลองและเขียนเล่น https://medium.com/@minseomikki/set-in-the-python-4f540d417540)


data model ก็ง่ายๆ เราสามารถใส่ default หรือ init อันนี้ไม่แน่ใจนะ ได้ด้วยแล้วกัน


ตัวอย่างการใช้งาน เช่น การ sort หาข้อมูลที่เราต้องการมาตัวนึง



quiz 2 ก็มาตบท้าย โจทย์คือให้เรา filter ข้อมูลตามโจทย์ที่กำหนดให้
ตรวจสอบด้วย unit test เหมือนเดิม แต่เขาเขียน test ผิดไปนิดนุงง
quiz 2 make it posh, make it blend, make it happen
ตัว Test quiz 2 ความจริงมีมากกว่านี้อีก



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 เหมือนกันนะเออ http://hadihariri.com/2017/05/28/raspberry-pi-starter-kit-and-kotlin-native/


โดยของ iOS จะแปลง kotlin ไปเป็น C++ แล้วเปลี่ยนไปเป็น Objective-C และจบที่ Swift
และมีการโชว์ให้ดูด้วย โดยมี reference ตามนี้ http://justmaku.org/2017-06-07-kotlin-on-ios

ซึ่งก็รันได้จริงๆนะเออ นึกถึง react.js เหมือนกันนะ


ซึ่งถ้าเราอยากเอา Kotlin ไปเขียนหน้าเว็บงี้ ตามไปอ่านได้ที่นี่เลย https://github.com/Kotlin/kotlin-fullstack-sample

---

สุดท้ายขอบคุณ Thailand Kotlin Developer ที่จัดงานนี้นะคะ
และรูปจากคุณ Wanchuda Sukarrom ที่ถ่ายภาพเก็บตกของงานนะคะ
ส่วนรูปด้านบนจากแอดมินกรุ๊ปค่ะ คุณ Verachad Wongsawangtham ทำท่าเป็นรูปตัว K สดๆกันเลยทีเดียว

ส่วนเว็บของกลุ่ม https://thaikotlindev.github.io/ ใช้ kotlin ทำทั้งหมดเลย

ลองเล่น 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

ถ้าข้อมูลส่วนไหนผิดพลาดก็ขออภัยด้วยนะคะ
สามารถติติงได้เพื่อข้อมูลที่ถูกต้องค่ะ :)

ป้ายกำกับ: