Java til Scala #1: Kompakt og konsis syntaks

Bloggpostserie om Javaproblemer løst i Scala

Faggruppen Scala&JVM i Bekk har som oppgave å utforske alternative språk på Javaplatformen. Vi har det seneste halvåret fokusert på Scala og økosystemet rundt dette språket. Dette er det første innlegget i en bloggpostserie hvor vi skal forsøke å beskrive hvordan ting som vi mener er tungvindte og usmidige i Java er mer elegant løst i Scala. Vi kommer til å streife innom emner som:

  • kompakt syntaks
  • manipulering av collections
  • hvordan unngå “boilerplate”-kode
  • multippel arv

… og flere andre interessante tema. Ved hjelp av enkle eksempler skal vi forklare hvorfor vi synes at Scala har løst disse utfordringene på en måte som gjør hverdagen vår som programmerere enklere, og morsommere.

Kompakt og konsis syntaks

“Less code = fewer bugs!”

er blitt et slags mantra i moderne software. I denne første posten skal jeg snakke litt om hvilke triks Scala-designerne har brukt for å gi oss utviklere mer uttrykkskraft pr. tegn og dermed muligheten til å skrive mer forståelig kode med mindre sjanse for feil. La oss starte med et kodeeksempel: Denne lille kodesnutten filterer ut alle partall fra en liste på tre tall og lagrer resultatet i en immutabel variabel. Nå skal jeg forklare de ulike teknikkene som er brukt for at vi skal kunne utrykke dette i en så kort onliner.

Typeinferens

Scala har en typeinferens-mekanisme som sørger for at man i de aller fleste tilfeller kan droppe å skrive hvilken type en variabel har. Unntaket er metode- og konstruktør-parametre. I koden over ser man hvordan vi kunne ha definert typer hvis vi var nødt til det.

Sigleton object factory method

Å lage en ferdig utfylt liste er noe de fleste utviklere gjør daglig, og i Java har det alltid føltes så bortkastet å først instansiere lista med new() for deretter å legge til ett og ett element med add(). I Scala har klasser ofte noe som heter “companion objects”, som kan ha en factory-metode (apply) som brukes til å lage en instans av klassen. I eksemplet over er det akkurat dette som skjer når vi lager en liste, som forøvrig er immutabel, med tre elementer i.

Funksjonelle metoder

Scala inkluderer masse metoder fra funksjonell programmering, som f.eks. map() og filter()List, og selv om disse per se ikke er syntaks gjør de at man slipper unna masse “boiler plate”-kode hver gang en liste skal traverseres og behandles. Resultatet er kompakt og selvforklarende kode.

Metoder og returverdier

Hvis vi tenker oss at vi skal lage en partall()-metode istedet for variabelen i de tidligere eksemplene trenger vi bare å bytte ut val med def. Likhetstegnet etter metodenavnet indikerer at denne metoden returnere noe og vi trenger ikke å skrive return foran det som skal returneres. Det er alltid siste linje i metoden som returneres og i dette tilfellet er også paranteser rundt metodekroppen droppet fordi hele metode er på en linje.

Bonus: Tegnsetting

Hvis vi går tilbake til det opprinnelige eksemplet så legger vi merke til at det hverken er brukt punktum eller semikolon i koden. En medlemsfunksjon i en klasse/trait som tar kun ett parameter kan kalles med et mellomrom istedet for et punktum og semikolon trengs bare hvis man skal gjøre to separate funksjonskall eller tilordninger på samme linje.

Stay tuned for more in the weeks to come!