Ċ import Ġlink . kotlin . scripts . Article Ċ import Ġlink . kotlin . scripts . Link Type .* Ċ import Ġlink . kotlin . scripts . Language Codes .* Ċ import Ġjava . time . LocalDate Ċ Ċ // Ġlanguage = Markdown Ċ val Ġbody Ġ= Ġ""" Ċ #### ĠFunctional Ġprogramming Ġin ĠKotlin , Ġa Ġnew Ġlanguage Ġfrom ĠJetBrains Ċ Ċ I Ġdid Ġ[ a Ġvideo Ġtutorial Ġon ĠFP Ġin ĠKotlin ]( http :// blog . jetbrains . com / kotlin / 2 0 1 5 / 1 1 / web inar - recording - functional - programming - with - kotlin /), Ġwhich Ġcan Ġbe Ġviewed Ġonline . Ċ Ċ If Ġyou Ġuse Ġ. NET Ġyou Ġprobably Ġheard Ġabout ĠF #, Ġa Ġmulti - par adig m Ġbut Ġessentially Ġfunctional Ġprogramming Ġlanguage Ġfor Ġthe ĠCLR . ĠAnd Ġyou Ġprobably Ġheard Ġgood Ġthings Ġabout Ġit . ĠYou Ġmay Ġalso Ġhave Ġheard Ġof ĠHaskell , Ġwhich Ġis Ġsimilar . Ċ Ċ Per haps Ġyou Ġwould Ġlike Ġlanguages Ġsuch Ġas Ġthese Ġon Ġthe ĠJVM , Ġbut Ġwith Ġgreat Ġtool Ġsupport Ġand Ġwithout Ġ_ mand ating _ Ġa Ġfunctional Ġstyle Ġ... Ġjust Ġmaking Ġit Ġavailable Ġwhen Ġyou Ġwant Ġit . Ċ Ċ [** The ĠKotlin Ġlanguage **]( http :// kotlin lang . org /) Ġmay Ġat Ġfirst Ġgl ance Ġappear Ġto Ġbe Ġnothing Ġmore Ġthan Ġan Ġupgraded ĠJava : Ġlots Ġof Ġsyntax Ġconven i ences , Ġsome Ġtype Ġinference Ġand Ġso Ġon . ĠBut Ġdig Ġa Ġlittle Ġdeeper Ġand Ġyou Ġwill Ġdiscover Ġthat Ġmany Ġof Ġthe Ġmost Ġpopular Ġand Ġadvanced Ġfeatures Ġof Ġfunctional Ġlanguages Ġare Ġavailable . Ċ Ċ Let âĢĻ s Ġget Ġstarted Ġwith Ġsome Ġsimple Ġexamples . Ċ Ċ * Ġ* Ġ* Ċ Ċ ### ĠAl gebra ic Ġdata Ġtypes Ċ Ċ It âĢĻ s Ġnormal Ġfor Ġfunctional Ġlanguages Ġto Ġsupport Ġsyntax Ġlike Ġthis : Ċ Ċ ``` haskell Ċ data Ġ ĠMaybe Ġa Ġ Ġ= Ġ ĠNothing Ġ| ĠJust Ġa ĊĠ Ġderiving Ġ( Eq , ĠOrd ) Ċ ``` Ċ Ċ That âĢĻ s ĠHaskell , Ġand Ġit Ġdefines Ġa Ġtype Ġcalled ĠâĢľ Maybe âĢĿ Ġthat Ġhas Ġtwo Ġso Ġcalled Ġ_ type Ġconstructors _, ĠNothing Ġand ĠJust . ĠThe ĠJust Ġtype Ġconstructor Ġtakes Ġa Ġsingle Ġparameter Ġof Ġunspecified Ġtype . ĠThe Ġderiving Ġkeyword Ġhere Ġmeans Ġa ĠMaybe Ġcan Ġbe Ġcompared Ġfor Ġequality , Ġand Ġordered . ĠIt Ġcan Ġalso Ġbe Ġcalled Ġa Ġ_ tagged Ġunion _. Ċ Ċ Kotlin Ġdoesn âĢĻ t Ġneed Ġa ĠMaybe Ġtype Ġbecause Ġit Ġhas Ġoptional ity Ġas Ġa Ġbuilt Ġin Ġpart Ġof Ġthe Ġtype Ġsystem . ĠOptional ity Ġis Ġso Ġcommon Ġin Ġprograms Ġthat Ġit Ġmakes Ġsense Ġto Ġintegrate Ġit Ġat Ġa Ġdeep Ġlevel , Ġfor Ġboth Ġconvenience Ġand Ġperformance Ġreasons : Ċ Ċ ``` kotlin Ċ val Ġs : ĠString ? Ġ= Ġif Ġ( Math . random () Ġ< Ġ 0 . 5 ) Ġ" Y ay !" Ġelse Ġnull Ċ println (" length Ġof Ġstring Ġis Ġ.... Ġ${ " $" }{ s . length () }") Ċ ``` Ċ Ċ Here , Ġwe Ġget Ġa Ġcompile Ġerror Ġon Ġthe Ġsecond Ġline , Ġbecause Ġwe âĢĻ re Ġtrying Ġto Ġread Ġthe Ġlength Ġof Ġa Ġstring Ġwe Ġmight Ġnot Ġactually Ġhave , Ġdepending Ġon Ġa Ġcoin Ġflip . ĠThere âĢĻ s Ġa Ġsimple Ġfix : Ċ Ċ ``` kotlin Ċ val Ġs : ĠString ? Ġ= Ġif Ġ( Math . random () Ġ< Ġ 0 . 5 ) Ġ" Y ay !" Ġelse Ġnull Ċ println (" length Ġof Ġstring Ġis Ġ.... Ġ${ " $" }{ s ?. length () Ġ?: Ġ- 1 }") Ċ ``` Ċ Ċ Here , Ġs ?. length () Ġwill Ġyield Ġnull Ġif Ġs Ġwas Ġnull , Ġand Ġthe Ġ?: Ġoperator Ġuses Ġthe Ġright Ġhand Ġside Ġif Ġthe Ġleft Ġhand Ġside Ġis Ġnull . ĠSo Ġthis Ġprints Ġ- 1 Ġif Ġthe Ġcoin Ġflip Ġdidn âĢĻ t Ġyield Ġthe Ġstring . Ċ Ċ However , Ġwe Ġwon âĢĻ t Ġthink Ġabout Ġthat Ġmore Ġhere . Ċ Ċ Because Ġthe ĠMaybe Ġtype Ġis Ġso Ġfamiliar Ġto Ġfunctional Ġprogram mers , Ġlet âĢĻ s Ġdefine Ġan Ġequivalent Ġof Ġit Ġhere Ġjust Ġfor Ġillustr ation . Ċ Ċ ``` kotlin Ċ sealed Ġclass ĠMaybe < out ĠT > Ġ{ ĊĠĠĠ Ġobject ĠNone Ġ: ĠMaybe < Nothing >() ĊĠĠĠ Ġdata Ġclass ĠJust < T >( val Ġt : ĠT ) Ġ: ĠMaybe < T >() Ċ } Ċ ``` Ċ Ċ The Ġsyntax Ġisn âĢĻ t Ġas Ġter se Ġas ĠHaskell , Ġbut Ġisn âĢĻ t Ġbad Ġeither . ĠThe Ġdata Ġmodifier Ġhere Ġis Ġoptional , Ġbut Ġadding Ġit Ġgives Ġus Ġuseful Ġfeatures . Ċ Ċ We Ġcan Ġdo Ġa Ġvariety Ġof Ġfunctional Ġthings Ġwith Ġthis : Ċ Ċ ``` kotlin Ċ val Ġj Ġ= ĠMaybe . Just ( 1 ) Ċ val Ġ( i ) Ġ= Ġj Ċ ``` Ċ Ċ Here , Ġwe Ġdefine Ġa ĠâĢľ just âĢĿ Ġcontaining Ġan Ġinteger , Ġand Ġthen Ġwe Ġde structure Ġit Ġto Ġget Ġthe Ġinteger Ġback . ĠNotice Ġthe Ġlack Ġof Ġtypes : Ġit âĢĻ s Ġall Ġinferred . ĠIf Ġthe Ġtype Ġhad Ġdefined Ġmultiple Ġfields , Ġwe Ġcould Ġ[ de structure Ġall Ġof Ġthem ]( http :// kotlin lang . org / docs / reference / multi - declarations . html ), Ġwhich Ġis Ġhow Ġthis Ġis Ġactually Ġmeant Ġto Ġbe Ġused : Ċ Ċ ``` kotlin Ċ data Ġclass ĠPet ( val Ġname : ĠString , Ġval Ġage : ĠInt ) Ċ val Ġalice Ġ= ĠPet (" Alice ", Ġ 6 ) Ċ val Ġ( name , Ġage ) Ġ= Ġalice Ċ ``` Ċ Ċ What Ġabout Ġpattern Ġmatching ? ĠThis Ġis Ġwhere Ġthe Ġword ĠâĢľ sealed âĢĿ Ġabove Ġcomes Ġin Ġhandy ; Ġwe Ġcan Ġdo Ġan Ġex haustive Ġpattern Ġmatch Ġwithout Ġan Ġelse / otherwise Ġbranch : Ċ Ċ ``` kotlin Ċ class ĠUser ( val Ġage : ĠInt ) Ċ Ċ fun Ġlookup From DB ( s : ĠString ): ĠMaybe < User > Ġ= ĠMaybe . None Ċ Ċ fun Ġprint User ( username : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġrec Ġ= Ġlookup From DB ( username ) ĊĠĠĠ Ġwhen Ġ( rec ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠMaybe . None Ġ-> Ġprintln (" not Ġfound ") ĊĠĠĠĠĠĠĠ Ġis ĠMaybe . Just < User > Ġ-> Ġprintln ("${ " $" }{ rec . t . age } Ġyears Ġold ") ĊĠĠĠ Ġ} Ċ } Ċ ``` Ċ Ċ Here , Ġwe Ġdefine Ġa Ġsimple Ġclass Ġwith Ġa Ġsingle Ġimmutable Ġproperty Ġ( age ), Ġand Ġa Ġcouple Ġof Ġfunctions . ĠWe Ġhave Ġa Ġlookup From DB Ġfunction Ġthat Ġreturns Ġa ĠMaybe : Ġin Ġthis Ġcase , Ġalways Ġa ĠNone , Ġbut Ġthat âĢĻ s Ġjust Ġan Ġexample . Ċ Ċ Then Ġwe Ġuse Ġ[ the Ġwhen Ġexpression ]( http :// kotlin lang . org / docs / reference / control - flow . html # when - expression ) Ġto Ġdo Ġa Ġpattern Ġmatch Ġon Ġthe Ġtype . ĠWhen Ġexpressions Ġare Ġpretty Ġflexible . ĠThey Ġcan Ġuse Ġarbitrary Ġexpressions Ġon Ġthe Ġleft Ġhand Ġside Ġof Ġeach Ġcase Ġand Ġif Ġthe Ġexpression Ġis Ġa Ġtype Ġquery , Ġthe Ġcode Ġon Ġthe Ġright Ġhas Ġthe Ġcast Ġapplied Ġautomatically . ĠThat âĢĻ s Ġwhy Ġwe Ġcan Ġjust Ġaccess Ġthe Ġt Ġproperty Ġof Ġrec Ġimmediately . Ċ Ċ ### ĠIm mut ability Ċ Ċ Kotlin Ġis Ġnot Ġa Ġpure ĠFP Ġlanguage Ġand Ġdoes Ġnot Ġhave Ġa ĠâĢĺ default âĢĻ Ġfor Ġmutable Ġvs Ġimmutable . ĠIt Ġg ently Ġencour ages Ġim mut ability Ġin Ġa Ġfew Ġplaces Ġby Ġchoice Ġof Ġsyntax , Ġbut Ġotherwise Ġmakes Ġyou Ġchoose Ġeach Ġand Ġevery Ġtime . Ċ Ċ Here âĢĻ s Ġsome Ġcode : Ċ Ċ ``` kotlin Ċ data Ġclass ĠPerson ( var Ġname : ĠString , Ġvar Ġage : ĠInt ) Ċ val Ġp Ġ= ĠPerson (" Mi ke ", Ġ 3 1 ) Ċ p . name Ġ= Ġ" Bob " Ċ ``` Ċ Ċ Here ĠâĢľ p âĢĿ Ġis Ġan Ġimmutable Ġ** val ** ue : Ġit Ġcannot Ġbe Ġre assigned . ĠIt âĢĻ s Ġlike Ġa Ġfinal Ġvariable Ġin ĠJava , Ġor Ġa Ġlet Ġexpression Ġin ĠHaskell / F #. ĠBut Ġthen Ġthe Ġcontents Ġof Ġthis Ġstructure Ġare Ġmutable Ġ** var ** iable s , Ġso Ġthey Ġcan Ġbe Ġre assigned Ġlater . ĠThe ĠIDE Ġhighlight s Ġidentifiers Ġdifferently Ġif Ġthey âĢĻ re Ġmutable . Ċ Ċ Here âĢĻ s Ġhow Ġit Ġlooks Ġlike , Ġfully Ġimmutable Ċ Ċ ``` kotlin Ċ data Ġclass ĠPerson ( val Ġname : ĠString , Ġval Ġage : ĠInt ) Ċ val Ġmi ke Ġ= ĠPerson (" Mi ke ", Ġ 3 1 ) Ċ val Ġolder Mi ke Ġ= Ġmi ke . copy ( age Ġ= Ġ 3 2 ) Ċ ``` Ċ Ċ The Ġcopy Ġmethod Ġis Ġauto Ġgenerated Ġwhenever Ġthe Ġdata Ġmodifier Ġis Ġused . ĠIt Ġhas Ġa Ġnamed Ġargument Ġfor Ġevery Ġproperty , Ġwith Ġthe Ġdefault Ġvalue Ġof Ġthat Ġargument Ġbeing Ġwhatever Ġthe Ġcurrent Ġvalue Ġis . ĠNet Ġresult , Ġyou Ġcan Ġuse Ġit Ġto Ġcreate Ġa Ġfresh Ġobject Ġwith Ġtweak ed Ġfields . Ċ Ċ Lists Ġare Ġimmutable Ġby Ġdefault : Ċ Ċ ``` kotlin Ċ val Ġpeople Ġ= ĠlistOf ( mike , Ġolder Mi ke ) Ċ people . add ( Person (" Bob ", Ġ 5 0 )) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠERROR Ċ Ċ val Ġpeople DB Ġ= Ġarray ListOf ( mike , Ġolder Mi ke ) Ċ people DB . add ( Person (" Bob ", Ġ 5 0 )) Ċ Ċ val Ġview : ĠList < Person > Ġ= Ġpeople DB Ċ val Ġsnapshot Ġ= Ġpeople DB . toList () Ċ ``` Ċ Ċ The Ġsecond Ġline Ġwon âĢĻ t Ġcompile : ĠlistOf () Ġreturns Ġan Ġimmutable Ġlist . ĠThe Ġfourth Ġline Ġdoes Ġbecause Ġwe Ġspecifically Ġpicked Ġan Ġarray Ġlist Ġ( vs Ġa Ġlinked Ġlist ), Ġwhich Ġis Ġmutable . ĠWe Ġcan , Ġof Ġcourse , Ġcast Ġaway Ġthe Ġmut ability Ġto Ġcreate Ġa Ġread Ġonly Ġview , Ġor Ġclone Ġthe Ġlist Ġto Ġcreate Ġa Ġsnapshot Ġof Ġit . Ċ Ċ Currently Ġthere âĢĻ s Ġno Ġdedicated Ġlist Ġliteral Ġsyntax . ĠThere Ġmight Ġbe Ġin Ġfuture , Ġbut Ġfor Ġnow , Ġwe Ġmust Ġuse Ġfunctions . Ċ Ċ ### ĠMapping , Ġfiltering , Ġreducing Ġetc Ċ Ċ Kotlin Ġhas Ġsupport Ġfor Ġefficient Ġlamb das , Ġand Ġextends Ġthe Ġdefault ĠJDK Ġcollections Ġclasses Ġto Ġsupport Ġcommon Ġfunctions Ġfrom ĠFP Ġstandard Ġlibraries . ĠThis Ġcan Ġeven Ġbe Ġused Ġon ĠJava Ġ 6 Ġand Ġthus ĠAndroid : Ċ Ċ ``` kotlin Ċ val Ġnums Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 ) Ċ val Ġr Ġ= Ġnums . map Ġ{ Ġit Ġ* Ġ 2 Ġ}. sum () ĠĠĠĠĠĠ Ġ// Ġr Ġ== Ġ 2 0 Ċ ``` Ċ Ċ Here , Ġthe ĠâĢľ it âĢĿ Ġidentifier Ġis Ġa Ġconvenience : Ġif Ġa Ġlambda Ġhas Ġonly Ġone Ġargument , Ġit âĢĻ s Ġcalled ĠâĢľ it âĢĿ Ġautomatically . ĠWe Ġcan Ġspecify Ġan Ġexplicit Ġname Ġwhen ĠâĢľ it âĢĿ Ġwould Ġget Ġtoo Ġconfusing , Ġlike Ġin Ġnested Ġlamb das . Ċ Ċ Map Ġis Ġan Ġ_ extension Ġfunction _. ĠWhere ĠJava Ġprogram mers Ġwould Ġdefine Ġa ĠFoo Utils Ġclass Ġwith Ġstatic Ġmethods Ġto Ġadd Ġfunctionality Ġto ĠFoo Ġclasses , ĠKotlin Ġlets Ġyou Ġextend Ġthe Ġclass Ġwith Ġa Ġ( static ally Ġdis patched ) Ġmethod Ġdirectly . ĠAnd Ġthen Ġit Ġuses Ġthat Ġto Ġgive ĠJava Ġplatform Ġtypes Ġlike ĠIterable Ġ[ new Ġfeatures ]( http :// kotlin lang . org / api / latest / jvm / stdlib / kotlin /- iterable / index . html ). Ċ Ċ A Ġmore Ġadvanced Ġexample : Ċ Ċ ``` kotlin Ċ val Ġstr s Ġ= ĠlistOf (" fish ", Ġ" tree ", Ġ" dog ", Ġ" tree ", Ġ" fish ", Ġ" fish ") Ċ val Ġfreq s Ġ= Ġstr s . groupBy Ġ{ Ġit Ġ}. map Values Ġ{ Ġit . value . size () Ġ} Ċ println ( freq s ) ĠĠĠĠ Ġ// Ġ{ fish = 3 , Ġtree = 2 , Ġdog = 1 } Ċ ``` Ċ Ċ ### ĠRecursive Ġfunctions Ċ Ċ Functional Ġprogram mers Ġlike Ġto Ġexpress Ġsolutions Ġto Ġproblems Ġusing Ġrecursion . ĠThis Ġoften Ġneeds Ġan Ġoptim isation Ġcalled Ġ_ tail Ġcall Ġoptim isation _ Ġto Ġwork Ġwell . ĠKotlin Ġsupports Ġthis Ġin Ġcertain Ġcircumstances . Ċ Ċ Here âĢĻ s Ġa Ġsimple Ġexample . ĠA Ġ_ fix point _ Ġof Ġa Ġmathematical Ġfunction Ġis Ġan Ġinput Ġthat Ġgives Ġitself Ġas Ġan Ġoutput . ĠTo Ġfind Ġa Ġfix point Ġof Ġcos ine , Ġyou Ġcan Ġkeep Ġfeed ing Ġthe Ġoutput Ġback Ġas Ġan Ġinput Ġuntil Ġthings Ġstabil ise . ĠHere âĢĻ s Ġan Ġexample Ġin Ġan Ġimper ative Ġfashion : Ċ Ċ ``` kotlin Ċ private Ġfun Ġcos Fix point (): ĠDouble Ġ{ ĊĠĠĠ Ġvar Ġx Ġ= Ġ 1 . 0 ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= ĠMath . cos ( x ) ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġy ) Ġreturn Ġy ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġy ĊĠĠĠ Ġ} Ċ } Ċ ``` Ċ Ċ Pretty Ġsimple : Ġstarting Ġat Ġ 1 . 0 Ġwe Ġkeep Ġcalling Ġcos Ġuntil Ġcos ( a ) Ġ== Ġa . Ċ Ċ Here âĢĻ s Ġthe Ġsame Ġwritten Ġin Ġa Ġrecursive Ġmanner : Ċ Ċ ``` kotlin Ċ tail rec Ġfun Ġcos Fix point ( x : ĠDouble Ġ= Ġ 1 . 0 ): ĠDouble Ġ{ ĊĠĠĠ Ġval Ġr Ġ= ĠMath . cos ( x ) ĊĠĠĠ Ġreturn Ġif Ġ( x Ġ== Ġr ) Ġx Ġelse Ġcos Fix point ( r ) Ċ } Ċ ``` Ċ Ċ It Ġcould Ġalso Ġbe Ġa Ġone Ġlin er Ġ( or Ġtwo Ġhere , Ġwith Ġbig Ġfonts ): Ċ Ċ ``` kotlin Ċ import Ġjava . lang . Math . cos Ċ Ċ tail rec Ċ fun Ġf ( x : ĠDouble Ġ= Ġ 1 . 0 ): ĠDouble Ġ= Ġif Ġ( x Ġ== Ġcos ( x )) Ġx Ġelse Ġf ( cos ( x ))) Ċ ``` Ċ Ċ That Ġversion Ġrelies Ġon Ġthe ĠJIT Ġcompiler Ġto Ġnotice Ġthat Ġit Ġcan Ġeliminate Ġthe Ġduplicated Ġcall Ġto ĠMath . cos ( x ). Ċ Ċ ### ĠCur ry ing , Ġpartial Ġapplication , Ġcomposition Ċ Ċ These Ġare Ġfeatures Ġyou âĢĻ ll Ġfind Ġin ĠF # Ġand ĠHaskell , Ġthough ĠI Ġnever Ġfelt Ġa Ġneed Ġfor Ġthem Ġmyself . ĠCur ry ing Ġturns Ġa Ġfunction Ġinto Ġa Ġchain Ġof Ġfunctions . ĠPartial Ġapplication Ġlets Ġyou ĠâĢĺ fix âĢĻ Ġcertain Ġparameters Ġto Ġa Ġfunction , Ġresulting Ġin Ġa Ġnew Ġfunction . Ċ Ċ Kotlin Ġdoesn âĢĻ t Ġsupport Ġthese Ġout Ġof Ġthe Ġbox . ĠBut Ġit âĢĻ s Ġflexible Ġenough Ġthat Ġthey Ġcan Ġbe Ġadded Ġby Ġ[ a Ġlibrary Ġcalled Ġfun K tion ale ]( https :// github . com / M ario A rias C / fun KT ion ale / wiki ), Ġin Ġa Ġnatural Ġmanner : Ċ Ċ ``` kotlin Ċ import Ġorg . f unktion ale . cur ry ing .* Ċ Ċ val Ġsum 2 ints Ġ= Ġ{ Ġx : ĠInt , Ġy : ĠInt Ġ-> Ġx Ġ+ Ġy Ġ} Ċ val Ġcur ried : Ġ( Int ) Ġ-> Ġ( Int ) Ġ-> ĠInt Ġ= Ġsum 2 ints . cur ried () Ċ assertEquals ( cur ried ( 2 )( 4 ), Ġ 6 ) Ċ val Ġadd 5 Ġ= Ġcur ried ( 5 ) Ċ assertEquals ( add 5 ( 7 ), Ġ 1 2 ) Ċ ``` Ċ Ċ ... Ġand Ġ... Ċ Ċ ``` kotlin Ċ import Ġorg . f unktion ale . partials .* Ċ Ċ val Ġformat Ġ= Ġ{ Ġprefix : ĠString , Ġx : ĠString , Ġpostfix : ĠString Ġ-> ĊĠĠĠ Ġ"${ " $" }{ prefix }${ " $" }{ x }${ " $" }{ postfix }" Ċ } Ċ Ċ val Ġprefix And Bang Ġ= Ġformat ( p 3 Ġ= Ġ" !") Ċ Ċ // ĠPass ing Ġjust Ġthe Ġfirst Ġparameter Ġwill Ġreturn Ġa Ġnew Ġfunction Ċ val Ġhello Ġ= Ġprefix And Bang ( p 1 Ġ= Ġ" Hello , Ġ") Ċ Ċ println ( hello (" world ")) Ċ ``` Ċ Ċ ### ĠL az yn ess Ċ Ċ Kotlin Ġis Ġa Ġstrict / e ager Ġlanguage , Ġand Ġthis Ġis Ġhow Ġit Ġshould Ġbe . ĠAs Ġfar Ġas ĠI âĢĻ m Ġaware , Ġno Ġother Ġwell Ġknown Ġlanguage Ġuses Ġlazy - by - default Ġexcept ĠHaskell . Ċ Ċ However Ġyou Ġcan Ġdo Ġlazy Ġcomput ations Ġif Ġyou Ġwant Ġto . ĠHere âĢĻ s Ġa Ġdead Ġsimple Ġreal Ġworld Ġexample : Ġavoid ing Ġthe Ġwork Ġof Ġbuilding Ġa Ġstring Ġif Ġlogging Ġis Ġdisabled . Ċ Ċ ``` kotlin Ċ val Ġlogging Enabled Ġ= ĠSystem . getProperty (" log ") Ġ!= Ġnull Ċ Ċ fun Ġlog ( s : ĠString ): ĠUnit Ġ= Ġif Ġ( logging Enabled ) Ġprintln ( s ) Ċ Ċ fun Ġlog ( ls : Ġ() Ġ-> ĠString ): ĠUnit Ġ= Ġif Ġ( logging Enabled ) Ġprintln ( ls ()) Ċ ``` Ċ Ċ The Ġlog Ġfunction Ġis Ġover loaded : Ġit Ġcan Ġtake Ġan Ġactual Ġstring , Ġor Ġa Ġfunction Ġthat Ġcalculates Ġa Ġstring : Ċ Ċ ``` kotlin Ċ log (" now !") Ċ log Ġ{ Ġ" calculate Ġme Ġlater " Ġ} Ċ ``` Ċ Ċ Functional Ġprogramming Ġoccasion ally Ġinvolves Ġbuilding Ġinfinite Ġlists Ġof Ġthings Ġand Ġoperating Ġon Ġthem Ġin Ġa Ġlazy Ġand Ġpossibly Ġparallel Ġmanner . Ġ[ This Ġis Ġoften Ġseen Ġas Ġa Ġkey Ġsell ing Ġpoint Ġfor ĠFP ]( http :// research . microsoft . com / en - us / um / people / sim on pj / papers / stm / STM To ky o Apr 1 0 . pdf ) Ġ( see Ġslide Ġ 1 0 ). Ċ Ċ Since Ġversion Ġ 8 ĠJava Ġcan Ġdo Ġthis Ġtoo , Ġand Ġtherefore Ġso Ġcan ĠKotlin . ĠFor Ġexample : Ċ Ċ ``` kotlin Ċ val ĠONE Ġ= ĠBigInteger . ONE Ċ fun Ġpri mes ( n : ĠLong ) Ġ= ĊĠĠĠĠĠĠĠ ĠStream . iterate ( ONE ) Ġ{ Ġit Ġ+ ĠONE Ġ}. ĊĠĠĠĠĠĠĠ Ġfilter Ġ{ Ġit . is Prob able Prime ( 1 6 ) Ġ}. ĊĠĠĠĠĠĠĠ Ġlimit ( n ). ĊĠĠĠĠĠĠĠ Ġto List () Ċ ``` Ċ Ċ Java Ġcalls Ġinfinite Ġlazy Ġlists Ġ_ streams ._ ĠHere , Ġwe Ġbuild Ġa Ġlist Ġof Ġall Ġthe Ġpositive ĠBig Inte gers . ĠThen Ġwe Ġselect Ġonly Ġthe Ġones Ġthat Ġare Ġprobably Ġprime Ġnumbers Ġwith Ġchance Ġ 2 ^ 1 6 , Ġaccording Ġto Ġthe ĠM iller - R ab in Ġprim ality Ġtest . ĠThen Ġwe Ġtake Ġ_ n _ Ġof Ġthem Ġand Ġput Ġthem Ġinto Ġa Ġregular Ġnon - lazy Ġlist . ĠThis Ġis Ġclass ical Ġfunctional Ġprogramming . Ċ Ċ How Ġfast Ġis Ġthis ? Ċ Ċ ``` kotlin Ċ repeat ( 3 ) Ġ{ ĊĠĠĠ Ġval Ġt Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠ Ġpri mes ( 1 0 0 0 0 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" T ook Ġ${ "$ "} t Ġm sec ") Ċ } Ċ ``` Ċ Ċ On Ġmy Ġlaptop , Ġafter Ġthe Ġfirst Ġrun Ġwhen Ġthe ĠJIT Ġcompiler Ġhas Ġcr unched , Ġit Ġtakes Ġabout Ġ 1 . 5 Ġseconds . Ċ Ċ One Ġnice Ġthing Ġabout Ġpipelines Ġof Ġpure Ġfunctions Ġis Ġyou Ġcan Ġparalle li se Ġthem . ĠLet âĢĻ s Ġdo Ġthat Ġnow : Ċ Ċ ``` kotlin Ċ fun Ġpri mes ( n : ĠLong ) Ġ= ĊĠĠĠĠĠĠĠ ĠStream . iterate ( ONE ) Ġ{ Ġit Ġ+ ĠONE Ġ}. ĊĠĠĠĠĠĠĠ Ġparallel (). ĊĠĠĠĠĠĠĠ Ġfilter Ġ{ Ġit . is Prob able Prime ( 1 6 ) Ġ}. ĊĠĠĠĠĠĠĠ Ġlimit ( n ). ĊĠĠĠĠĠĠĠ Ġto Array () Ċ ``` Ċ Ċ We Ġinserted Ġa Ġcall Ġto Ġparallel () Ġin Ġour Ġstream . ĠThis Ġtells Ġthe ĠJVM Ġto Ġrun Ġthe Ġrest Ġof Ġthe Ġpipeline Ġin Ġmultiple Ġthreads . ĠR er unning Ġthe Ġprogram Ġshows Ġthat Ġthis Ġimproved Ġperformance Ġ 3 x : Ġit Ġnow Ġonly Ġtakes Ġhalf Ġa Ġsecond . ĠNot Ġbad ! Ċ Ċ ### ĠSTM Ċ Ċ Software Ġtransaction al Ġmemory Ġis Ġa Ġway Ġto Ġwrite Ġconcurrent Ġcode . ĠIt Ġis Ġwell Ġexplained Ġin Ġ[ this Ġpaper Ġby ĠSimon ĠP ey ton - J ones ]( http :// research . microsoft . com / en - us / um / people / sim on pj / papers / stm / be autiful . pdf ), Ġone Ġof Ġthe Ġarchitect s Ġof ĠHaskell . Ċ Ċ Instead Ġof Ġusing Ġlocks Ġyou Ġwrite Ġcode Ġlike Ġthis : Ċ Ċ ``` kotlin Ċ var Ġaccount 1 Ġ= Ġ 5 Ċ var Ġaccount 2 Ġ= Ġ 0 Ċ Ċ fun Ġtransfer ( amount : ĠInt ) Ġ{ ĊĠĠĠ Ġatomic Ġ{ ĊĠĠĠĠĠĠĠ Ġaccount 1 Ġ-= Ġamount ĊĠĠĠĠĠĠĠ Ġaccount 2 Ġ+= Ġamount ĊĠĠĠ Ġ} Ċ } Ċ ``` Ċ Ċ From Ġthe Ġprogram mers Ġperspective , Ġanything Ġthat Ġhappens Ġinside Ġthe Ġatomic Ġblock Ġtakes Ġeffect Ġall Ġat Ġonce Ġwhen Ġthe Ġblock Ġis Ġexited Ġand Ġthere Ġcan Ġbe Ġno Ġrace Ġconditions Ġinside Ġit . ĠBut Ġmultiple Ġthreads Ġcan Ġall Ġbe Ġinside Ġthe Ġatomic Ġblock Ġat Ġonce , Ġdoing Ġuseful Ġwork . ĠPretty Ġne at , Ġright ? Ċ Ċ A Ġsimple Ġimplementation Ġwould Ġbe Ġto Ġhave Ġa Ġg iant Ġglobal Ġlock , Ġbut Ġthat âĢĻ d Ġbe Ġvery Ġslow . ĠSo Ġf anci er Ġimplementations Ġrecord Ġevery Ġchange Ġmade Ġinside Ġthe Ġblock Ġby Ġthreads Ġrunning Ġconcurrent ly , Ġand Ġdetect Ġconflicts : Ġif Ġthere Ġis Ġa Ġconflict , Ġthe Ġblock Ġis Ġretried . ĠHaskell Ġhas Ġan Ġimplementation Ġof Ġsuch Ġa Ġthing . Ċ Ċ Kotlin Ġdoes Ġnot Ġhave Ġlanguage Ġsupport Ġfor Ġsoftware Ġtransaction al Ġmemory . ĠHowever , Ġthis Ġis Ġnot Ġsuch Ġa Ġbig Ġdeal Ġbecause Ġvia Ġthe ĠJVM Ġit Ġgets Ġsupport Ġusing Ġlibraries Ġlike Ġ[ Scala ĠSTM ]( http :// nbr on son . github . io / scala - stm / quick _ start . html ) Ġ( see Ġbelow ), Ġand Ġeven Ġsomething Ġbetter : Ġ_ hardware _ Ġtransaction al Ġmemory . ĠY up . Ċ Ċ Mod ern Ġ( very Ġmodern ) ĠIntel Ġch ips Ġsupport Ġa Ġset Ġof Ġprocessor Ġextensions Ġcalled ĠTS X . ĠTS X Ġallows Ġcode Ġto Ġcreate Ġan Ġatomic Ġtransaction Ġat Ġthe Ġhardware Ġlevel . ĠChanges Ġto ĠRAM Ġare Ġbuffered Ġup Ġin Ġcache Ġlines Ġand Ġinter ference Ġbetween Ġthreads Ġis Ġtracked Ġby Ġthe ĠCPU Ġitself . ĠIf Ġthere Ġwas Ġa Ġconflict , Ġthe ĠCPU Ġabort s Ġthe Ġtransaction Ġand Ġexpects Ġthe Ġcode Ġto Ġeither Ġtry Ġagain Ġor Ġfall Ġback Ġto Ġregular Ġlocking . ĠIf Ġno Ġthread Ġbump ed Ġinto Ġyou , Ġyour Ġwrites Ġare Ġfl ushed Ġto ĠRAM Ġin Ġone Ġgo Ġat Ġthe Ġend . Ċ Ċ Starting Ġwith ĠJava Ġ 8 ĠUpdate Ġ 4 0 , Ġso - called ĠâĢľ RT M Ġlocking âĢĿ Ġis Ġenabled Ġby Ġdefault Ġwhen Ġthe ĠCPU Ġsupports Ġit . ĠThis Ġconverts Ġ_ every _ ĠJava Ġsynchronized Ġblock Ġinto Ġa Ġhardware Ġlevel Ġatomic Ġtransaction Ġusing ĠTS X . ĠThat Ġmeans Ġyou Ġwill Ġhave Ġmultiple Ġthreads Ġrunning Ġinside Ġsynchronized Ġblocks Ġat Ġonce . ĠThe ĠJVM Ġprofiles Ġthe Ġapp Ġto Ġfind Ġblocks Ġthat Ġexperience Ġfrequent Ġthread Ġinter ference , Ġwhere Ġthe ĠCPU Ġis Ġwast ing Ġtime Ġdue Ġto Ġconstant ly Ġrolling Ġback / retry ing , Ġand Ġconverts Ġthem Ġback Ġto Ġusing Ġregular Ġlocks . ĠAs ĠKotlin Ġruns Ġon Ġthe ĠJVM Ġit Ġgets Ġthis Ġfunctionality Ġfor Ġfree . Ċ Ċ This Ġlets Ġyou Ġwrite Ġcode Ġin Ġthe ĠâĢľ one Ġbig Ġlock âĢĿ Ġstyle Ġwithout Ġsuffer ing Ġthe Ġperformance Ġdown sides , Ġas Ġlong Ġas Ġyou Ġare Ġon Ġsufficient ly Ġnew Ġhardware . Ċ Ċ I Ġshould Ġnote Ġhere Ġthat ĠST Ms Ġoften Ġprovide Ġextra Ġfeatures , Ġlike Ġthe Ġability Ġto Ġpause / retry Ġa Ġcode Ġblock Ġwhen Ġthe Ġdependencies Ġchange , Ġor Ġthe Ġability Ġto Ġexplicitly Ġcancel Ġa Ġtransaction Ġwithout Ġretry ing Ġit Ġ( by Ġthrowing Ġan Ġexception ). ĠHardware ĠTM Ġdoesn âĢĻ t Ġoffer Ġthis , Ġor Ġrather Ġthe ĠJVM Ġdoesn âĢĻ t Ġsurface Ġthe Ġsupport Ġat Ġthe Ġmoment . ĠIf Ġyou Ġwant Ġmore Ġcontrol , Ġyou Ġmust Ġuse Ġa Ġlibrary Ġand Ġexplicitly Ġchange Ġyour Ġdata Ġmodel Ġto Ġincorpor ate Ġtransaction al Ġvariables : Ċ Ċ ``` kotlin Ċ import Ġscala . concurrent . stm . j api . STM .* Ċ Ċ val Ġcounter Ġ= Ġnew Ref ( 1 0 ) Ċ try Ġ{ ĊĠĠĠ Ġatomic Ġ{ ĊĠĠĠĠĠĠĠ Ġincrement ( counter , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġprintln (" counter Ġis Ġ${ " $" }{ counter . get () }") ĠĠĠ Ġ// Ġ-> Ġ 1 1 ĊĠĠĠĠĠĠĠ Ġthrow ĠException (" roll Ġback !! ") ĊĠĠĠ Ġ} Ċ } Ġcatch ( e : ĠException ) Ġ{ ĊĠĠĠ Ġprintln (" counter Ġis Ġ${ " $" }{ counter . get () }") ĠĠĠĠĠĠĠ Ġ// Ġ-> Ġ 1 0 Ċ } Ċ ``` Ċ Ċ H askell Ġhas Ġone Ġother Ġne at Ġtrick Ġup Ġits Ġs lee ve ĠâĢĶ using Ġits Ġtype Ġsystem Ġit Ġcan Ġensure Ġthat Ġvariables Ġare Ġonly Ġaccessed Ġinside Ġatomic Ġblocks , Ġso Ġyou Ġcan Ġnever Ġforget Ġto Ġwrap Ġyour Ġcode Ġup Ġproperly . ĠWe Ġcan Ġdo Ġsomething Ġa Ġbit Ġsimilar Ġin ĠKotlin : Ċ Ċ ``` kotlin Ċ class ĠThread Box < T >( v : ĠT ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġvalue Ġ= Ġv ĊĠĠĠ Ġ@ Synchron ized Ġfun Ġlocked < R >( f : ĠT . () Ġ-> ĠR ): ĠR Ġ= Ġvalue . f () Ċ } Ċ Ċ val Ġbank Ġ= ĠThread Box ( object Ġ{ ĊĠĠĠ Ġval Ġaccounts Ġ= Ġint ArrayOf ( 1 0 , Ġ 0 , Ġ 0 , Ġ 0 ) Ċ }) Ċ Ċ fun Ġtransfer ( from : ĠInt , Ġto : ĠInt , Ġamount : ĠInt ) Ġ{ ĊĠĠĠ Ġbank . locked Ġ{ ĊĠĠĠĠĠĠĠ Ġaccounts [ from ] Ġ-= Ġamount ĊĠĠĠĠĠĠĠ Ġaccounts [ to ] Ġ+= Ġamount ĊĠĠĠ Ġ} Ċ } Ċ ``` ĊĊ Ċ A ĠThread Box Ġis Ġa Ġsimple Ġclass Ġthat Ġtakes Ġa Ġpointer Ġto Ġsome Ġobject Ġin Ġits Ġconstructor . ĠIt Ġkeeps Ġthat Ġpointer Ġprivate ly . ĠSo , Ġif Ġthere âĢĻ s Ġno Ġother Ġreference Ġto Ġthe Ġpassed Ġobject Ġit Ġcan Ġonly Ġbe Ġaccessed Ġvia Ġthe ĠThread Box . ĠWhen Ġwe Ġdeclare Ġ_ bank _, Ġwe Ġuse Ġthe Ġobject Ġkeyword Ġto Ġcreate Ġan Ġanonymous Ġobject Ġand Ġpass Ġit Ġin âĢ Ĭ âĢĶ âĢ Ĭ so Ġwe Ġknow Ġthe Ġonly Ġway Ġto Ġreach Ġthe Ġaccounts Ġarray Ġis Ġvia Ġthe ĠThread Box . ĠAnd Ġthe ĠThread Box Ġonly Ġgives Ġout Ġthat Ġpointer Ġinside Ġan Ġatomic Ġblock . Ċ Ċ The Ġcompiler Ġwon âĢĻ t Ġlet Ġus Ġaccess Ġthe Ġarray Ġoutside Ġan Ġatomic Ġblock Ġ... Ġunless Ġwe Ġlet Ġa Ġreference Ġescape . ĠSo Ġthis Ġis Ġnot Ġas Ġstrong Ġas Ġthe ĠHaskell Ġtype Ġsystem Ġapproach , Ġbut Ġit âĢĻ s Ġa Ġgood Ġstart . Ċ Ċ There âĢĻ s Ġa Ġversion Ġof Ġthis Ġcode Ġthat Ġcan Ġcatch Ġmore Ġmist akes Ġ[ here ]( https :// gist . github . com / mike he arn / 1 ad 4 a 9 c 3 7 5 e 5 9 e 5 2 b 8 cf ). Ċ Ċ The Ġatomic Ġmethod Ġis Ġa Ġhigher Ġorder Ġfunction Ġprotected Ġby Ġa Ġregular ĠJava Ġsynchronized Ġmethod , Ġand Ġit Ġjust Ġimmediately Ġcalls Ġthe Ġprovided Ġcode Ġblock Ġunder Ġthe Ġlock . ĠThe ĠJVM Ġwill Ġignore Ġthe Ġlock Ġon Ġhardware Ġthat Ġsupports ĠTS X Ġand Ġall Ġthreads Ġcan Ġproceed Ġin Ġparallel , Ġin Ġan Ġatomic Ġtransaction . ĠAs Ġlong Ġas Ġthe Ġtwo Ġthreads Ġare Ġusing Ġdifferent Ġaccount ĠIDs Ġfor Ġ_ from _ Ġand Ġ_ to _, Ġno Ġlocking Ġis Ġdone Ġat Ġall : Ġthat Ġmakes Ġit Ġnice Ġand Ġfast . Ċ Ċ ### ĠThings ĠKotlin Ġlack s Ċ Ċ At Ġthe Ġmoment Ġthere Ġis Ġno Ġway Ġto Ġcontrol Ġside Ġeffects : Ġany Ġfunction Ġcall Ġcan Ġbe Ġpotentially Ġside Ġeffect ing . ĠIt Ġwould Ġbe Ġnice Ġif Ġa Ġfuture Ġversion Ġof Ġthe Ġlanguage Ġintroduced Ġsomething Ġlike Ġthe ĠC ++ Ġconst Ġkeyword , Ġor ĠD âĢĻ s Ġtrans itive Ġconst , Ġto Ġreduce Ġthe Ġre liance Ġon Ġactually Ġimmutable Ġdata Ġstructures . ĠThe ĠJVM Ġoffers Ġfeatures Ġthat Ġcan Ġse al Ġoff Ġcommon Ġsources Ġof Ġexternal Ġstate , Ġsuch Ġas Ġthe Ġdisk Ġand Ġnetwork , Ġhowever Ġthe Ġheap Ġis Ġstill Ġavailable . ĠIt Ġmay Ġbe Ġan Ġinteresting Ġproject Ġto Ġmake Ġthe ĠJVM âĢĻ s Ġsandbox ing Ġfeatures Ġeasily Ġavailable Ġvia Ġa ĠKotlin ĠDSL . Ċ Ċ There Ġis Ġnot Ġat Ġthis Ġmoment Ġany Ġhigh Ġperformance Ġimmutable Ġcollections Ġlibrary . ĠBoth ĠClo jure Ġand ĠScala Ġhave Ġmaps Ġand Ġsets Ġin Ġwhich Ġmut ating Ġthe Ġcollection Ġreturns Ġa Ġnew Ġcollection , Ġwith Ġinternal Ġdata Ġsharing Ġto Ġmake Ġperformance Ġpractical . ĠThe ĠKotlin Ġstandard Ġlibrary Ġdoes Ġnot . ĠIf Ġsomeone Ġwere Ġto Ġmake Ġone , Ġusing Ġ[ the ĠCH AMP Ġcode ]( http :// m ichael . ste ind or fer . name / publications / oop sla 1 5 . pdf ) Ġpublished Ġthis Ġyear Ġwould Ġgive Ġsignificant Ġimprovements Ġover Ġthe Ġalgorithms Ġused Ġin ĠScala / Clo jure . Ċ Ċ """ Ċ Ċ Article ( ĊĠ Ġtitle Ġ= Ġ" Kotlin ĠâĿ ¤ ĠFP ", ĊĠ Ġurl Ġ= Ġ" https :// medium . com /@ oct sky ward / kotlin - fp - 3 bf 6 3 a 1 7 d 6 4 a ", ĊĠ Ġcategories Ġ= ĠlistOf ( ĊĠĠĠ Ġ" Kotlin ", ĊĠĠĠ Ġ" Functional " ĊĠ Ġ), ĊĠ Ġtype Ġ= Ġarticle , ĊĠ Ġlang Ġ= ĠEN , ĊĠ Ġauthor Ġ= Ġ" Mi ke ĠH ear n ", ĊĠ Ġdate Ġ= ĠLocalDate . of ( 2 0 1 5 , Ġ 9 , Ġ 1 8 ), ĊĠ Ġbody Ġ= Ġbody Ċ ) Ċ