Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Why not use Kotlin? - Kotlin for Java Developers

Avatar for Yasuhisa Honda Yasuhisa Honda
November 14, 2025
65

Why not use Kotlin? - Kotlin for Java Developers

Avatar for Yasuhisa Honda

Yasuhisa Honda

November 14, 2025
Tweet

Transcript

  1. ˜-:$PSQPSBUJPO  8IBUJT,PUMJO  8IBUJT,PUMJO  %FTJHOFE%FWFMPQFECZ+FU#SBJOT 0QFOTPVSDF  HJUIVCDPN+FU#SBJOTLPUMJO

     .VMUJQBSBEJHN  001 '1 %FDMBSBUJWF  .VMUJQMBUGPSN  ,PUMJO+7. ,PUMJO/BUJWF ,PUMJO+4 ,PUMJO8"4.  *OJUJBMMZEFTJHOFEGPSTFSWFSTJEFBOEEFTLUPQBQQMJDBUJPOPOUIF+7.<>  (PPHMFBOOPVODFEPGGJDJBMTVQQPSUPO"OESPJE!(PPHMF*0b <>IUUQTXXXBCSFTMBWDPNCJP
  2. ˜-:$PSQPSBUJPO  ,PUMJO`TQIJMPTPQIZ 8IBUJT,PUMJO Language design is cast in stone,

    but this stone is reasonably soft, and with some effort we can reshape it later. Kotlin Design Team 1SJODJQMFTPGQSBHNBUJDFWPMVUJPOIUUQTLPUMJOMBOHPSHEPDTLPUMJOFWPMVUJPOQSJODJQMFTIUNM Kotlin is a pragmatic programming language … and is focused on interoperability, safety, clarity, and tooling support. Andrey Breslav, Lead Language Designer IUUQTCMPHKFUCSBJOTDPNLPUMJOLPUMJOSFMFBTFEQSBHNBUJDMBOHVBHFGPSKWNBOEBOESPJE 1SBHNBUJD 0QFOUPDPNNVOJUZGFFECBDL JTTVFT CVHT QSPQPTBMT
  3. ˜-:$PSQPSBUJPO  (SPXUIPGUIF,PUMJOFDPTZTUFN (SPXUIPGUIF,PUMJOFDPTZTUFN  -BOHVBHF  9999  

     ,$PNQJMFS  $PNQJMFS1MVHJOT  "MMPQFO /PBSH LTQ  1PXFSBTTFSU ʜ  5PPMJOH  *OUFMMJ+*%&"  ,PUMJO/PUFCPPL  -JLFB+VQZUFS/PUFCPPL
  4. ˜-:$PSQPSBUJPO  (SPXUIPGUIF,PUMJOFDPTZTUFN (SPXUIPGUIF,PUMJOFDPTZTUFN  -BOHVBHF  9999  

     ,$PNQJMFS  $PNQJMFS1MVHJOT  "MMPQFO /PBSH LTQ  1PXFSBTTFSU ʜ  5PPMJOH  *OUFMMJ+*%&"  ,PUMJO/PUFCPPL  -JLFB+VQZUFS/PUFCPPL  .VMUJQMBUGPSN  ,PUMJO+7.  4FSWFSTJEF "OESPJE "35   ,PUMJO/BUJWF CBDLFOE--7.   J04 4XJGU0CK$JOUFSPQ   ,PUMJO+4  'SPOUFOE#BDLFOE$-*  ,PUMJO8BTN  8FCCSPXTFS
  5. ˜-:$PSQPSBUJPO  4FSWFS4JEF,PUMJO (SPXUIPGUIF,PUMJOFDPTZTUFN 4FSWFS4JEF,PUMJO  &OIBODFOVMMTBGFUZ  'BTUFS,PUMJOSFGMFDUJPO 

    &WPMWFDPOGJHVSBUJPO%4-T ,PUMJOY4QSJOH "4USBUFHJD1BSUOFSTIJQ 3FG  IUUQTCMPHKFUCSBJOTDPNLPUMJOTUSBUFHJDQBSUOFSTIJQXJUITQSJOH  IUUQTLPUMJODPOGDPNUBMLT
  6. ˜-:$PSQPSBUJPO  4FSWFS4JEF,PUMJO (SPXUIPGUIF,PUMJOFDPTZTUFN 4FSWFS4JEF,PUMJO  &OIBODFOVMMTBGFUZ  'BTUFS,PUMJOSFGMFDUJPO 

    &WPMWFDPOGJHVSBUJPO%4-T ,PUMJOY4QSJOH "4USBUFHJD1BSUOFSTIJQ 3FG  IUUQTCMPHKFUCSBJOTDPNLPUMJOTUSBUFHJDQBSUOFSTIJQXJUITQSJOH  IUUQTLPUMJODPOGDPNUBMLT  3PE+PIOTPO`TUBMLT  ,PUMJOBOE4QSJOH5IFNPEFSO TFSWFSTJEFTUBDLc,PUMJO$POG  $SFBUPSPG4QSJOH/PEFTJSFUPXSJUF +BWBc5BMLJOH,PUMJO
  7. ˜-:$PSQPSBUJPO  /BNFE"SHVNFOUT ,PUMJOWT+BWB4ZOUBY class Person { String id; String

    name; Integer age; String address; String email; String phoneNumber; } final Person person = new Person( "1", “James Gosling", null, “Canada", null, null ); +BWB
  8. ˜-:$PSQPSBUJPO  /BNFE"SHVNFOUT ,PUMJOWT+BWB4ZOUBY class Person { String id; String

    name; Integer age; String address; String email; String phoneNumber; } final Person person = new Person( "1", “James Gosling", null, “Canada", null, null ); +BWB class Person ( val id: String, val name: String, val age: Int?, val address: String, val email: String?, val phoneNumber: String?, ) val person = Person( id = "2", name = "Andrey Breslav", age = null, address = "Tokyo", email = null, phoneNumber = null ) ,PUMJO
  9. ˜-:$PSQPSBUJPO  /BNFE"SHVNFOUT ,PUMJOWT+BWB4ZOUBY class Person { String id; String

    name; Integer age; String address; String email; String phoneNumber; } final Person person = new Person( "1", “James Gosling", null, “Canada", null, null ); +BWB class Person ( val id: String, val name: String, val age: Int?, val address: String, val email: String?, val phoneNumber: String?, ) val person = Person( id = "2", name = "Andrey Breslav", age = null, address = “Russia", email = null, phoneNumber = null ) ,PUMJO 3FEVDFDPHOJUJWFMPBEJNQMFNFOUBUJPOFSSPST PSNJTUBLFT 
  10. ˜-:$PSQPSBUJPO  &YUFOTJPO ,PUMJOWT+BWB4ZOUBY  &YQBOEFYJTUJOHDMBTTFTXJUIOFXGVODUJPOT  -JCSBSJFT  0VUDPNF

     3FBEBCJMJUZ 4FNBOUJDT // not using extension fun convertToCalendarFormat(date: LocalDate): String { val f = DateTimeFormatter.ofPattern("yyyy/MM/dd") return date.format(f) } // Using extension fun LocalDate.toCalendarFormat(): String { val f = DateTimeFormatter.ofPattern("yyyy/MM/dd") return this.format(f) } // GOOD LocalDate.now().toCalendarFormat() // NOT GOOD convertToCalendarFormat(LocalDate.now())
  11. ˜-:$PSQPSBUJPO  &YUFOTJPO ,PUMJOWT+BWB4ZOUBY  &YQBOEFYJTUJOHDMBTTFTXJUIOFXGVODUJPOT  -JCSBSJFT  (FOFSBUFEDPEF

    FH0QFO"1* 1SPUPCVG   0VUDPNF  3FBEBCJMJUZ 4FNBOUJDT  4FQBSBUJPOPG$PODFSOT  EPNBJOMBZFS㲗SFQPTJUPSZMBZFS /** It’s a generated class, do not edit it manually. **/ class PersistUserRequest ( var userId: String? = null, var username: String? = null, ) class GetUserResponse ( var userId: String? = null, var username: String? = null, ) fun PersistUserRequest.toUser(): User { return User( id = requireNotNull(this.userId), name = requireNotNull(this.username), ) } fun User.toResponse(): GetUserResponse { return GetUserResponse( userId = requireNotNull(this.id), username = requireNotNull(this.name), ) } val requestUser: User = requestDTO.toUser() val response = user.toResponse()
  12. ˜-:$PSQPSBUJPO  &YUFOTJPO ,PUMJOWT+BWB4ZOUBY  &YQBOEFYJTUJOHDMBTTFTXJUIOFXGVODUJPOT  -JCSBSJFT  (FOFSBUFEDPEF

    FH 0QFO"1* 1SPUPCVG   0VUDPNF  3FBEBCJMJUZ 4FNBOUJDT  4FQBSBUJPOPG$PODFSOT  EPNBJOMBZFS㲗SFQPTJUPSZMBZFS  /PUPOMZGVODUJPO CVUBMTPQSPQFSUZ DPNQBOJPOPCKFDU
  13. ˜-:$PSQPSBUJPO  $MBTTFT ,PUMJOWT+BWB4ZOUBY  %BUB$MBTT  'PSIPMEJOHEBUB  "VUPNBUJDBMMZHFOFSBUFDPEF

     equals()hashCode() toString() copy() componentN() DPOTUSVDUPS  componentN()ʜ%FTUSVDUVSJOHEFDMBSBUJPOTFHval (x, y) = cartesian  7BMVF$MBTT  'PSXSBQQJOHBWBMVFUPDSFBUFEPNBJOTQFDJGJDUZQF  0QUJNJ[F JOMJOFPSCPYJOH 3FEVDFNFNPSZBMMPDBUJPODPTUT($DPTUT  4FBMFE$MBTT*OUFSGBDF
  14. ˜-:$PSQPSBUJPO  0UIFSTZOUBY ,PUMJOWT+BWB4ZOUBY  4NBSU$BTU  +BWB+&1l1BUUFSO.BUDIJOHGPSJOTUBODFPGz 3FMFBTFE 

     +BWB+&1l1BUUFSO.BUDIJOHGPSTXJUDIz 3FMFBTFE   4USJOH5FNQMBUFT  +BWB+&1l4USJOH5FNQMBUFTz 8JUIESBXO QFOEJOHSFEFTJHO   0QFSBUPSPWFSMPBE  6TF+, -CZPWFSMPBEJOHɹplus() minus()  %FGBVMUBSHVNFOUWBSBSHT  (PPECZFUP+BWB`TPWFSMPBEIFMM
  15. ˜-:$PSQPSBUJPO  ,PUMJOWT+BWB/VMM4BGFUZ // not null safety public static String

    findNameById(Integer id) { final User user = users.get(id); if (user != null) { return user.getName(); } return null; } final String name = findNameById(1).toUpperCase(); +BWB  55PSOVMM ,PUMJO  55  5 5PSOVMM
  16. ˜-:$PSQPSBUJPO public static String findNameById(@NonNull Integer id) { final User

    user = users.get(id); if (user != null) { return user.getName(); } return null; } // not null safety final String name = findNameById(1).toUpperCase();  ,PUMJOWT+BWB/VMM4BGFUZ +BWB  55PSOVMM 'PS4BGFUZ  !/PO/VMM ,PUMJO  55  5 5PSOVMM
  17. ˜-:$PSQPSBUJPO public static Optional<String> findNameById(@NonNull Integer id) { final User

    user = users.get(id); if (user != null) { return Optional.of(user.getName()); } return Optional.empty(); } final String name = findNameById(1).map(String::toUpperCase).orElse(null);  ,PUMJOWT+BWB/VMM4BGFUZ +BWB  55PSOVMM 'PS4BGFUZ  !/PO/VMM  0QUJPOBM5 ,PUMJO  55  5 5PSOVMM
  18. ˜-:$PSQPSBUJPO  ,PUMJOWT+BWB/VMM4BGFUZ fun findNameById(id: Int): String? = users[id]?.name val

    name = findNameById(2)?.uppercase() +BWB  55PSOVMM 'PS4BGFUZ  !/PO/VMM  0QUJPOBM5 ,PUMJO  55  5 5PSOVMM 'PS4BGFUZʜ  /PUIJOH  &YQMJDJUOVMMBCJMJUZ4BGFDBMMT 
  19. ˜-:$PSQPSBUJPO  ,PUMJOWT+BWB/VMM4BGFUZ fun findNameById(id: Int): String? = users[id]?.name val

    name = findNameById(2)?.uppercase() $PNQBSFEUP+BWB ,PUMJOʜ  /POFFEGPS"OOPUBUJPOT  /POFFEGPSOptional  4BGFDBMMTTJNQMJGZOVMMIBOEMJOH public static Optional<String> findNameById(@NonNull Integer id) { final User user = users.get(id); if (user != null) { return Optional.of(user.getName()); } return Optional.empty(); } final String name = findNameById(1).map(String::toUpperCase).orElse(null);
  20. ˜-:$PSQPSBUJPO  ,PUMJOWT+BWB"TZODISPOPVT$PODVSSFODZ1BSBMMFMJTN +BWB  5ISFBEʜ04UISFBE  &YFDVUPS "TZOD"1*T /*0

    3FBDUPS  'VUVSF $PNQMFUBCMF'VUVSF  .PEFSO+BWB  7JSUVBM5ISFBET  MJHIUXFJHIUUISFBE  %FUFDU8BJUFH#MPDLJOH*0  04UISFBEVONPVOUNPVOU ,PUMJO  $PSPVUJOF  DPPQFSBUJWFUBTL TVTQFOESFTVNF   OPOCMPDLJOH TVTQFOEGVODUJPO   %JTQBUDIFS  UISFBEQPPMFSTDIFEVMFS  ⚠ /05&  ❌ #MPDLJOH  5ISFBE-PDBM  QSPQBHBUFDPOUFYU
  21. ˜-:$PSQPSBUJPO  4PVSDFPG$PODFSO ,PUMJOWT+BWB  "MMFYDFQUJPOBSFlVODIFDLFEz  Result<T>IBTPOMZ5ISPXBCMFPOGBJMVSF*UEPFTO`UNBUDIEPNBJOFSSPST  8PSL"SPVOET

     4FMGJNQMFNFOUBUJPO   5IJSE1BSUZ   BSSPXLUBSSPX  NJDIBFMCVMMLPUMJOSFTVMU  ,&&13JDI&SSPST &SSPS6OJPO5ZQF  &SSPS)BOEMJOH
  22. ˜-:$PSQPSBUJPO  +BWBJOUFSPQFSBCJMJUZ +BWBJOUFSPQFSBCJMJUZ  +BWBDBODBMM,PUMJO ,PUMJODBODBMM+BWB  (FOFSBMMZ l3FDPEFzQSPKFDUT

     .JHSBUJPOVOJUQFSBQQMJDBUJPO  *ODBTFPG +BWB,PUMJO  .JHSBUJPOVOJUQFSDMBTT&BTZ4BGF.JHSBUJPO
  23. ˜-:$PSQPSBUJPO  +BWBJOUFSPQFSBCJMJUZ +BWBJOUFSPQFSBCJMJUZ  +BWBDBODBMM,PUMJO ,PUMJODBODBMM+BWB  (FOFSBMMZ l3FDPEFzQSPKFDUT

     .JHSBUJPOVOJUQFSBQQMJDBUJPO  *ODBTFPG +BWB,PUMJO  .JHSBUJPOVOJUQFSDMBTT&BTZ4BGF.JHSBUJPO  ⚠ /05&  /VMMBCJMJUZ 1MBUGPSNUZQFT 55PS5   .VUBCJMJUZ  NVUBCMFJNNVUBCMF   &YDFQUJPO)BOEMJOH
  24. ˜-:$PSQPSBUJPO  5BLFBXBZ  ,PUMJOJTQPXFSGVMQSBHNBUJD  4ZOUBY /VMM4BGFUZ $PSPVUJOFT ʜ

     (SPXJOH&DPTZTUFN  (SFBU+BWBJOUFSPQFSBCJMJUZFBTZNJHSBUJPO  "TUSPOHBMUFSOBUJWFGPS+BWBEFWFMPQFST