
[Musica]
benvenuto a questo discorso su funzionale
programmare in Kotlin quanti di voi
conosci Carl a Nizza quanti di voi hanno
mai visto come molti di voi non hanno mai
sentito parlare mi sono vicino a te nel torto
camera
ok, chi ha fatto Kotlin prima di maggio?
17 ° 2007, adolescente giusto, è stato il giorno
che Google mi ha annunciato riguardo
Scozia, che sentito parlare dopo che
annuncio e non prima di un bel sì
pochi di voi come questo confermano
che ho sprecato sei anni della mia vita
parlando di Katli grazie comunque
Avrei potuto semplicemente aspettato e aspettato per
loro di dire qualcosa così ho intenzione di dare
una breve introduzione in termini di
programmazione funzionale con Kotlin cosa
c’è quello che non c’è ciò che puoi
utilizzare tramite terze parti e sì solo
dai abbastanza per poterlo forse
guarda un po ‘di più se lo sei
interessato come questo non è la sessione
per voi davvero imparare qualcosa
destra mi dire come seriamente in conferenza
i discorsi non riguardano l’apprendimento, sono così
Lo dico comunque
Mi piace sempre iniziare con perché è così
Inizierò con il motivo per cui qui a prendere un
guardare a questo codice non giudicarmi
era solo il codice demo che è simile
tutto il codice che scrivo e dimmi al più presto
come sai cosa fa alzare il tuo
mani e non gridare non mi piace dire oh
So cosa fa ti dirò solo
solo alza le mani e dimmelo
so cosa fa e se tu fossi nel mio
laboratorio di ieri non alzare la mano
perché sarebbe ingiusto
Qualcuno sa che abbiamo ottenuto uno due tre va bene
grazie metti giù le mani giù sono
bene
dai un’occhiata a questo alza le mani
quando sai cosa fa bene, quindi si
alziamo le mani molto più velocemente così
quando la gente dice perché funzionale
programmazione
bene perché è giusto, è così
la cosa hipster da fare oggigiorno ma
anche perché è potenzialmente più facile per
per capire bene l’idea alla base
la programmazione funzionale è da rimuovere
certe cose e aggiungere certe cose
questo rende il nostro codice un po ‘più
comprensibile e comprensibile quindi se
si guarda a questi due pezzi di codice che
fa qualcosa è esattamente lo stesso
come fa qualcosa sicuro che il
il tipo di reso potrebbe essere diverso ma il
il principio di ciò che fa è esattamente il
lo stesso e se guardi dai un’occhiata a questo
codice quello che stai guardando è un intero
un sacco di codice in cui nella tua testa tu
devo avere questo intero modello mentale di
che cosa esattamente sta succedendo proprio devo
avere un piccolo magazzino qui
la mia cache per memorizzare le mie variabili in cache
fuori quello che sta succedendo con quelli
le variabili aumentano mentre vanno
lungo
capire cosa stanno facendo le operazioni
cosa sta facendo ciascuna operazione se
è una dichiarazione se è un
espressione se è ciò che è
restituendo il negozio e provate e
fondamentalmente diventa un compilatore giusto e
diventare l’applicazione per interpretare questo
mentre con questo è essenzialmente
la stessa cosa è l’unica differenza
che ne ho estratto qualcosa
funzionalità in qualche altra cosa
che si chiama una funzione giusta e
Ho dato a quelle funzioni dei buoni nomi così
ognuno di noi capisce cosa sia
concetto di gruppo-per mezzo anche se loro
non capisco la sintassi di Kotlin
o non capiscono il concetto di
ciò che il gruppo reale funzione è però
loro praticamente sanno cosa significa
giusto e coppia tutti sanno che coppia
fa e tutti sanno cosa non tu
forse non sapete cosa fa la mappa ma
generalmente non appena capisci cosa
queste funzioni fanno questo diventa molto
più facile da seguire e questo è uno dei
obiettivi della programmazione funzionale intendo
ogni persona ha il suo ha il suo
obbiettivo
programmazione funzionale ma i benefici
che ho trovato nella programmazione funzionale
stanno essenzialmente alzando il livello
dell’astrazione che fa quelle astrazioni
essenzialmente funziona e quindi usa
quello di scrivere più espressivo e
codice conciso e c’è un importante
fattore qui perché conciso no
conduciamo sempre a ciò che è comprensibile
non può avere il codice conciso prendere uno di
quelle lingue esoteriche su Wikipedia
che inizia con una b e termina con a
e tu sai che è molto
condensato ma non è comprensibile così
si tratta di mantenere il codice che è
diritto comprensibile e questo è dove io
pensa a quello che chiameresti il
lo sai perché spesso le persone dicono
se sto facendo una programmazione funzionale
da dove comincio dove finisco ciò che è
la si conosce il il l’ultimo
epifania della programmazione funzionale dove
è solo il viaggio che ognuno di loro
tempo si inizia a capire di più e
di più e poi quando capisci questi
le cose sempre più sono lì
comodo e questo è dove puoi
stai bene così ora in termini di Kotlin cosa
faremo è un po ‘come dimostrarlo
gli aspetti funzionali di Colin perché
Colin come sai è se non lo sei
familiarità con Colin Colin è un
linguaggio di programmazione orientato agli oggetti
con costrutti funzionali cosa fa
ciò significa che è anche a
linguaggio funzionale ciò che è funzionale
linguaggio bene ci sono molte definizioni
dipende da chi chiedi se chiedi a
Programmatore Haskell generalmente lo faranno
dite che è solo Haskell se chiedete a
programmatore f-sharp diranno che è solo
F forte in genere il concordato
il sentimento è quel qualsiasi linguaggio quello
dà supporto alle funzioni come
i cittadini di prima classe possono essere considerati a
linguaggio funzionale , quindi cos’è
cittadini di prima classe che l’abilità
che posso essenzialmente avere funzioni
che posso passare in giro come parametri
che lascia il posto a funzioni di ordine superiore
la capacità di avere forse una sorta di
immutabilità in termini di stato
gestione ecc questa funzione è chiamata
in un linguaggio funzionale è di gran lunga
Ovviamente altrimenti cosa sto facendo
qui, come stai andando bene?
sai che non parlerò
programmazione in chiamata funzionalmente e
usare qualcosa come non so VB così
è il motivo per cui quell’account è funzionale
perché nel chiamarti hai l’abilità
per fare certe cose okay, ma andiamo
passare attraverso le basi nel caso in cui non lo sei
così familiare con Cortland qui
mi permetta di creare un nuovo file e non un
file zero è finito qui e lo faremo
colonna file vivi me Adoro nominare roba
va bene così e quello che vedremo qui è
essenzialmente qualche sintassi per Kotla ora
chiamando object-oriented quindi ho a
il cliente di classe ci va che è un
Classe hai appena dichiarato una classe in
personalizzato in Kotlin e posso creare un
funzione anche in Cortland
faccio stampare un messaggio e avrò un valore
che sto passando e poi posso te
sai fare quello che voglio con quello
parametro okay quindi questa è la base di a
funzione in nel chiamare una funzione da
l’ unità restituisce di default quindi se non lo fai
specificare l’unità si presume che sia
restituire unità di unità è esattamente la stessa
come vuoto tranne che non è vuoto lì
go che è la mia spiegazione c’è la
la differenza è che l’unità è in realtà un
oggetto quindi se non sei di nuovo familiare
l’oggetto è in Cortland che possiamo avere
classi e puoi creare istanze di
classi e poi puoi anche avere
oggetti che sono simili a Java
Script va bene e ti prego ogni volta che dico
Java Script pensa alle cose buone
di JavaScript non faccio mai il
confronto di JavaScript come in tutto il
diavolo che JavaScript va bene così è
un po ‘come JavaScript in termini di un
oggetto ora questo in realtà significa che è un
chiama e restituisce qualcosa in effetti tu
so se faccio quattro se faccio stampe dei risultati
messaggio e passando qualche valore e poi
Faccio una linea di stampa di risultato questo è
andando a restituirmi un valore che è
in realtà unità destra in modo da poter vedere quello
mi restituisce l’unità ora a posto
chiamarti puoi effettivamente avere una funzione
indica che una funzione non ritorna mai
e lo fai dicendo questo
gira niente e quando dico nulla che
letteralmente non significa niente, quindi scrivi
niente e poi quella funzione mai
Restituisce così si può vedere che questo
subito dice che questo bene in quello
caso appena ancora quello non funziona e
qui puoi vedere che questo è
codice irraggiungibile giusto perché da tutti
account ora interpreta il compilatore
che quella funzione non arriverà mai
ritorna così ti chiedi perché dovrei mai
voglio farlo bene per esempio
c’è una funzione integrata nel
libreria standard che è chiamata a fare
implementalo e se vai a fare te
posso vedere che essenzialmente lancia un no
implementato eccezione di errore e
non restituisce nulla di buono quindi se qualcuno mai
ti chiede in cosa consiste l’ oggetto di livello superiore
Kotlin si chiama any e ti chiedono
qual è quello che è in fondo a te
non dire niente e non ti trasformi nel
la verità e se non lo sai basta dire
niente comunque bene e sì pensare
hai ragione
okay, chiamandoci cerchiamo di essere concisi
Voglio dire, puoi vedere quanto sia concisa una classe
è così che posso anche fare un divertimento ad esempio
somma se scrivo un X int y int non lo faccio
fare qualcosa come questo ritorno X
inoltre y posso farlo molto più breve di a
funzione di espressione singola e giusta
restituire il valore ci inferenza di tipo
ora mi consentirà l’inferenza del tipo
sapremo il tipo di ritorno sulla base del
tipi di parametri e posso solo esprimere
ogni funzione essenzialmente come un singolo
funzione di espressione considerando la maggior parte di
noi ora abbiamo monitor 4K che non abbiamo nemmeno
hai la limitazione di 80 colonne così tu
può davvero davvero molto tempo
funzioni di espressione singola
bene ora questo è grande, ma uno dei
cose che ho detto in giro catturate dal
modo che era una battuta sulla colonna così
è solo che non mi interessa se non lo fai
ridi delle mie battute ma a volte delle persone
sono come se dicesse davvero qualcosa
è stupido sì, l’ho fatto a Carlin
sai che non potresti considerarlo a
linguaggio funzionale se non avessimo avuto
la capacità di aggirare le funzioni
che essenzialmente porta a un ordine superiore
funziona così ora ho un ordine più alto
funzione in Kotlin posso scrivere più in alto
ordine e poi questo prenderà
un
un parametro e quindi posso dire che sta andando
prendere una funzione e poi passare
la vera firma della funzione così
in questo caso dirò che questa funzione
è un int e richiede una int Internet
e restituisce un diritto int così essenzialmente
quello che sta dicendo è che questo è
ciò che questo è essenzialmente sta prendendo un
funzione che prende due parametri di
digita il numero intero e restituisce un intero okay
dal modo in cui puoi renderlo davvero fantastico
invece di scrivere funk, posso davvero
metti lambda a guardare questo
Metterò che è bello o che piacerebbe se
non impari altro in questa conversazione
so come digitare lambda ora, così che io sia
non ti dirò come farlo se non tu
sapere che è possibile no è solo con
un modello dal vivo comunque così questo è
essenzialmente il lambda che sta passando
in una funzione di alto ordine questo è un alto
funzione di ordine che sta prendendo un
parametro che è un’altra funzione così
ora posso chiamare questo ordine superiore e io
può passare nel lambda qualsiasi cosa
prende questa firma per cominciare con I can
passare in una funzione esistente voi
dereference che si fa riferimento che nel
Kotlin usando solo due punti del colon
giusto così qui sto passando nel
somma funzione perché corrisponde alla nostra
firma in modo da poter passare questo se io
voglio davvero passare un lambda e
lì sto avendo un lambda che è essere
passato a destra e cosa mi sta dicendo
questo è essenzialmente questo suggerimento
che puoi farlo in modo più efficiente
modo o un modo più carino o più idiomatico
in Kotlin che è questo se è l’ultimo
parametro per una funzione è un altro
funzione Non devo allegarlo
le parentesi destra così posso solo escludere
questo dalle parentesi e metterlo
al di fuori delle parentesi destra e il
le parentesi sarebbero andate qui ora dato che io
non ho altri parametri che posso
lascia cadere anche quelle parentesi perché
sono ridondanti a posto a Collin se tu
puoi scegliere un singolo parametro lambda
anche metterlo su più righe così da te
può fare una cosa del genere e se si
avere funzioni di ordine superiore che sono
solo con un singolo parametro, quindi abbiamo a
ospedale che prende solo un singolo
parametro che cosa puoi fare è scrivere
L’ospedale di fare X è X più che puoi
essenzialmente basta scriverlo più y va bene così
è possibile utilizzare lambdas a parametro singolo
con esso il nome invece di essere esplicito
questo mi dà il simile se lo sei
familiare con groovy è essenzialmente
la stessa cosa, così questi sono come
dichiari le funzioni di ordine superiore e
come puoi essenzialmente come lo sai
hai il tuo adesso nella lingua
di per sé non abbiamo alcun ordine superiore
funzioni in quanto tali abbiamo tutto ciò in
la libreria standard che è molto
piccola biblioteca che fa parte del Kotlin
per esempio che viene eseguito come tempo di esecuzione
se faccio numeri equivale a 1 a 100 ho a
un sacco di nuove funzioni qui a destra
così per esempio il filtro che faccio filtro
5 è uguale a 0 e quindi su questo lo mapperò
a 20 e poi su questo per esempio io
può fare un per ciascuno e stampare la linea
risultato attuale va bene e ora ottieni questo
bella piccola pipeline meravigliosa di
funzioni e puoi dire guarda che sto facendo
programmazione funzionale ok e poi in
circa 10 anni andremo a questo e
saranno 60 linee e ci chiediamo dove
abbiamo sbagliato e lo chiameremo
codice funzionale aziendale ok ma non farlo
preoccupatevi per quel momento qualcos’altro lo farà
vieni in giro che lo promuoverò
cosa avrà sempre un lavoro in questa vita
a destra avremo sempre un lavoro giusto che
fanno parte del distruggere le cose che noi
più tardi vieni a sistemarci bene, quindi tutto
di questi fanno parte dello standard
libreria che è stata definita come
l’estensione funziona quindi è molto piccola
e disponibile su un intero gruppo di
cose diverse
funzioni di estensione per quelli che sono
non hai familiarità con Kotlin
qualsiasi classe tu possa avere qualsiasi estensione
tipo di nuova funzionalità, quindi se ho un
Classe stringa che voglio fare un a
caso di cammello posso scrivere sul caso cammello e
ora fondamentalmente questo è implementato ora
quello che succede è che se ne prendo qualcuno
stringa ho la – funzione caso cammello
giusto così questo è ora disponibile per me
ovunque sia definito in
pacchetto quindi questi filtri
non che vedi qui sono tutti
essenzialmente funzioni di estensione su
iterables generica timbrels così loro sono
disponibile praticamente tutto okay
questo è gentile e ci dà anche un
un sacco di funzionalità all’interno del
libreria standard su stringhe e divertimento
e funzioni di estensione intorno a tutti
la roba degli archi , quindi è abbastanza
che è abbastanza decente anche una cosa
che useremo quello che farai
l’avviso è buono a Kotlin che puoi
in realtà chiama le funzioni all’interno della correzione
notazione quindi se ho un’estensione
la funzione che possiamo chiamare è la stessa di
che accetta un parametro che è valore
che controlla se questo è uguale al valore
e questa è l’ istanza attuale di me
puoi scriverlo così mi conosci
come me e anche io posso scriverlo
notazione infix va bene posso scrivere come
che ignora l’errore quindi è uguale a
destra così si aggiunge la correzione e poi in
puoi scriverlo essenzialmente allo stesso modo
così questo sembra bellissimo proprio questo
non va bene ora prima di tuffarsi di più
dentro ai fini delle funzioni let
mi limito a segnalare un paio di cose
prima di tutto bene qualcuno sa cosa
lambda è che ne ho appena mostrato uno proprio lì
tu vai
cos’è una funzione anonima è a
lambda, quindi se vai se vai
a Wikipedia che è la fonte di
la verità e tu dici il bicchiere di whisky
Amo il whisky e tu dici di sapere
lambda e tu scendi oh guarda che ho capito
è giusto lambda lambda computers in
scienza del computer
dite che avete comunque scritto in Wikipedia
quel lambda altrimenti noto come un
la funzione anonima è blah blah blah ora
in tutte le lingue i lambda sono uguali a
funzioni anonime , tranne in chiamata
colonna in realtà abbiamo anonimo
funziona pure bene così se vuoi
fare
funzioni anonime che puoi effettivamente
scrivi qualcosa come questo qui
quindi per esempio se ho il mio più alto
ordina la mia funzione di ordine superiore proprio così
invece di passare in una lambda così
Posso passare in un divertente XY e poi dentro
di che per esempio non ritorno X più y
okay e perché questo mi dà un e e
unità e oh eccoci andare così così è
un diverso per un lambda in Kotlin così tu
avere il concetto di funzione anonima
allora hai il concetto di lambda e
questo è importante perché i lambda hanno
certi comportamenti che è importante
per voi per sapere così per esempio se io
avere una funzione che è un contenitore e
Non intendo la finestra mobile perché c’è un modo
più contenitori e sono al giorno d’oggi e se
Passo per esempio un lambda qui
che prende ad esempio un int e
restituisce un diritto int e quindi lo farò
qualcosa come te conosce bene i numeri
i numeri equivalgono a 1 a 100 e poi lo farò
numeri per ciascuno quindi se numeri è
divisibile per 0, ho intenzione di fare a
tornare ok così se io, se si dà un’occhiata a
quel codice e facciamo solo no
bisogno di questo quindi dare un’occhiata a quel codice
giusto questo è un lambda
Espressione in Kotlin che sono
passare a per ciascuno per ciascuno è un
funzione di ordine superiore e io ti dico
ritorno e poi scriverò qui per
esempio stampa linea ciao a destra e poi
formattiamo questo, quindi scriverò
stampa linea ciao va bene ora se io
dai un’occhiata se ti direi se corro
quel contenitore del codice che cosa farà
stampare sullo schermo
cosa diresti intuitivamente che sia così
o andando a stampare ciao o niente
quale sarà il buongiorno ciao
ciao sono io no
quindi sì no, in realtà non stamperà
ciao non mi piace mai come questo è
Sono completamente controintuitivo, giusto io sono dentro
il foraggio sono in una lambda che farò
un ritorno perché non stamperà ciao
beh, la ragione per cui non ci sarà
ciao è perché a Kotlin quando tu
ritorna da una lambda fai un non-locale
ritorno non si effettua un ritorno locale così
ciò significa che questo tornerà
al di fuori della funzione contenitore e
Mi piace come mai perché è questo che prendiamo
uno sguardo all’implementazione di ciascuno
dare un’occhiata all’implementazione per
ognuno è in loop su elementi è
tuttavia, solo una funzione di ordine superiore
ha questa piccola cosa qui
chiamato inline in questo momento è in linea
parola molto elaborata per copia-incolla così quando
in realtà invochi ciò che sta per succedere
capita che sta per copiare e
incolla quel codice nel contenuto reale
il codice chiamante quindi non sta andando
avere come una chiamata stack di chiamate
un’altra funzione che sta per copiare e
incolla quel codice così non c’è esterno
funzione c’è solo una funzione
che è un contenitore e quando fai un
ritorno uscirà da quello
contenitore giusto cosa succede se non lo faccio
avere una funzione inline quindi se lo sapessi
dichiarare la mia funzione qui o un
funzione inline a cui non sono destinato
ognuno che non ha in linea te
non può fare un ritorno locale non locale
torna se scrivi di ritorno qui è
ti darò un errore ora se vuoi
in realtà fare un ritorno locale tornando indietro
alla funzione anonima invece di
passando in una lambda puoi quindi passare dentro
una funzione anonima come abbiamo visto qui
in questo caso il rendimento verrà effettivamente eseguito
quello che viene chiamato il ritorno locale così
tornerà al contenitore in un altro modo
è se non vuoi farlo, puoi farlo
usa le etichette che sono essenzialmente le
possibilità di chiamare il ritorno al lambda così
se questo lambda
causa per ciascuno quindi questo se questo
la funzione è chiamata per ciascuno quindi questo
ritorno sarebbe per ogni diritto se
questa funzione si chiama Jo e lo farà
essere restituito a Jo okay no questo sta andando
alla domanda è se sta andando a
stampa ciao quattro volte no sta andando a
ripetilo nessuno lo fa oh
sono miei ora cambia completamente
tutto bene comunque grazie ciao così
sì no che doveva essere al di fuori di
il foraggio va bene così ora lo faremo
interrompere le funzioni per un momento l’altro
cosa che abbiamo nel cotone è il
capacità di avere immutabilità l’abilità
avere immutabilità sono solo un poeta
oggi non sono così se ho una classe dati
ad esempio Val customer string e Val
la stringa del telefono è essenzialmente
cliente buon cliente Vega classe buona
questo è essenzialmente il creare un cliente
DTO per me con un paio di stringhe equivalenti
codice hash ecc. e chiama e ho capito
due proprietà immutabili Val significa
immutabile significa che non posso leggere
e scrivi e poi non posso scrivere a
loro una volta li ho inizializzati così
in generale vuoi stare lontano
mantenere uno stato mutevole uno dei
le premesse della programmazione funzionale è
stai lontano dallo stato e con i dati
classi per esempio è sempre bene
avere proprietà immutabili perché uno di
le cose che rimuoverete da
avere proprietà immutabili è il
concetto di una classe di dati non effettivamente
essere valido, quindi diciamo che tu
avere un cliente e tu quel cliente
ha letto e scrive proprietà ad alcuni
indicare qualcuno che scrive a quei clienti
aggiorna una proprietà bisogna avere un po ‘
ora logica di validazione all’interno del nostro cliente
per verificare se è ancora valido o
non se passi dall’idea che io
non è possibile creare un oggetto non valido effettuare tutto
delle tue proprietà di sola lettura e tu
sappi che una volta creato l’oggetto
è sempre valido e tu
devi preoccuparti di quello va bene ora questo
leggere solo è fantastico perché non posso farlo
qualcosa come i cambiamenti quindi se ho N
è uguale a uno non posso fare nessuna chiamata a me
non posso farlo più perché è così
dicendo che è una vocale che viene letta
solo io non posso fare nessun incarico e noi
avere le stesse cose nelle classi, quindi se io
do Val cliente e inizializzare che
valuta che la proprietà non può essere cambiata
il problema è che ci sono situazioni
dove può essere così per esempio qui io
avere un oggetto e ho una proprietà
chiamato valore che è Val questo significa
che è immutabile significa questo
non c’è modo per me di essere in grado di fare
qualcosa di simile è immutabile okay
questo è anche immutabile tranne che è
non immutabile giusto perché questo è
ha una proprietà con un getter personalizzato
che è possibile in Kotlin ma che cosa
sta facendo in questo caso è in realtà
cambiando tutto il tempo perché è
chiamare una funzione che il risultato finale
di quella funzione non è una costante
espressione quindi nei casi in cui si desidera
evitare questi scenari perché come perché
come non riesco a riassegnare il valore il
il valore stesso è immutabile se lo si desidera
sii esplicito su quello che è dove tu
può usare il Const in Kotlin e indicare
che questo essenzialmente deve essere un
espressione costante quindi deve essere
inizializzato come costante per essere
capace di rimanere veramente immutabile in termini
di ereditarietà nel chiamare di nuovo non lo facciamo
chiudi sai che la tua proprietà ha un
riferimento e quel riferimento è un altro
obiettare che ha proprietà mutabili
non c’è davvero modo di garantire
l’immutabilità fino in fondo a destra
ma altrimenti tu lo sai in questo
caso si possono fare certe cose per
garantire le proprietà in termini di loro
essendo costanti quindi iniziamo ora
entrare in alcune di queste cose che possiamo fare
con queste classi di dati giusto così tanto
di volte in cui scrivi qualche codice tu
dì ad esempio l’ inserimento del processo e il tuo
diritti Non conosco alcuni dati che servono
una stringa e poi dici se i dati sono
non vuoto quindi stampare il giorno della linea o
Dati i dati linea di stampa è buona cosa e
quindi facciamo la nostra gestione generale degli errori
giusto che fa eccezione e noi
in genere, getti un’eccezione come la
livello superiore I è abbastanza buono va bene
va tutto bene, quindi ora questo
va bene, va bene, è davvero fantastico
ma questo fa schifo in che senso
questo fa schifo perché se guardo a quello
firma che firma non è
Garantire mi sta mentendo proprio così
firma dicendo che questa funzione restituisce a
unità non è vero questa funzione può
potenzialmente restituire qualcos’altro è
lo stesso di qualcosa del genere se io
scrivi dividi X int Y int right X diviso
da parte di Y è una bugia a cui hanno mentito
noi tutte le nostre vite perché non lo è
vero perché per 0 che non sta andando a
restituire un numero intero sì, questo è ciò che è
chiamato una funzione parziale in questo
non funziona per tutti i potenziali input
valori rispetto a una funzione totale
quale per tutti i valori potenziali lo farà
lavoro così come posso essere esplicito su questo
giusto come posso dire che per esempio
la voce di processo può effettivamente lanciare un
eccezionalmente bene possiamo usare controllato
eccezioni come in Java
ora sto scherzando o puoi semplicemente usare Java
sapere così in genere alcune persone tendono a
evitare di utilizzare le eccezioni per errore
gestione e fanno qualcosa di simile
risultato giusto così ora creeranno a
classe chiamata
risultato e poi in quello risultati loro
potrebbe avere per esempio una proprietà che
sei a conoscenza della stringa di valori e poi?
avranno un’altra proprietà che è
chiamato errore booleano giusto che poi
diranno che sai se il risultato è
va bene allora tornerò risultato buono e
booleano falso e possiamo usare default
i parametri qui sono di default e in caso contrario
ritornerò
ok ora è bello non è così e se
sei generalmente in errore JavaScript
rappresentato come una e così tu puoi
dedicare del tempo a capire se si tratta di un evento o di un evento
errore quindi in questo caso restituirò un
risultato vero ora cosa c’è di sbagliato in te
ogni volta che ci vai, grazie
Allora, cosa c’è che non va ora in modo che
funziona tranne il problema qui è che se
Ho due parametri o se ne ho tre
che devono essere restituiti come risultato ora
Devo capire a guardarlo
cosa è esattamente nel contesto di a
risultato valido e cosa è esattamente nel
contesto di un risultato non valido che in
questo caso ci allontaniamo da questo e da noi
posso dire hey perché non facciamo qualcosa
altro
perché non abbiamo solo una classe base
che è risultato e quindi posso avere un
classe che è il successo che eredita
dal risultato e ho una classe che è
fallimento che eredita dal risultato due
e perché non posso farlo perché in
Kotlin di default è tutto così finale
ora posso fare ritorno al successo e qui io
può fare fallimento del risultato giusto e poi il
successo fallimento sta per avere un
proprietà che è valore per esempio di
tipo stringa e fallimento avrà
una proprietà di tipo messaggio per esempio
dicendo che il vero messaggio di errore va bene così
ora ho anche più informazioni qui
questo è un messaggio va bene così bene perché tu
può fare anche questa classe annidata
è ancora più bello perché ora posso allegare
in un contesto specifico va bene così ora io
può avere il mio risultato punto e successo
risultato del fallimento e ora mi dà
più informazioni contestuali su quando
è un risultato quando è un fallimento ora
questo è bello il problema è questo
ora arriva il mio amico e va a un file
che non è di proprietà di
la libreria standard e dice Oh data
classe a volte che eredita anche da
risultato proprio qui e ora se noi
ritorna al mio coso qui che ho
appena introdotto una nuova classe che
potenzialmente non so di giusto e
ora c’è un terzo caso, quello che sono
generalmente mostrandoti qui è il
concetto del tipo di dati algebrico che
è essenzialmente un tipo che può essere di uno
tipo o un altro tipo ora in Colleen come
non appena dichiarerai una classe aperta a nessuno
può ereditare da esso se si desidera chiudere
la nostra gerarchia cosa puoi fare è chiamarla
sigillato giusto così invece di aprirti
crearlo dice sigillato e che cosa
significa è che essenzialmente solo le classi
in questo specifico file sono autorizzati a
erediti da questo così in quel senso te
ottieni un po ‘di sicurezza in quello che vedrai
tutti i tipi quindi se torniamo a
vivi me lo puoi vedere adesso
mi dà un errore dicendo che non puoi
più a lungo erediti da a volte ok ora
questo è un modello abbastanza buono
perché posso usare questo più e più
di nuovo a destra invece di poter provare e
allontanarsi dalle eccezioni e spostarsi
verso queste classi di dati che mi consentono
per restituire risultati diversi in base a
successo o fallimento il problema è questo
è un sacco di codice di codice che io
costantemente a scrivere più e più volte
di nuovo così come posso provare a risolvere questo
problema bene è possibile utilizzare per esempio uno
di più librerie è una di queste
chiamato freccia chiunque abbia sentito parlare di freccia
giusto così la freccia ha questo concetto
fondamentalmente costruito nella freccia è un è un
la biblioteca che è disponibile era a esso
era una scusa me era una fusione tra
due librerie chiamate da uno di loro
categoria con una K un’altra chiamata
funzionalità sì avete indovinato che fosse
okay e hanno unito gli sforzi e hanno fatto un
una singola biblioteca chiamata freccia e loro
offrire subito alcuni extra
funzionalità per fare alcuni di questi
le cose sono più fluide quindi una di quelle cose
che forniscono è la capacità di avere
questo tipo di come questo o quei dati
classe va bene così in questo caso ho un
o l’uno è un tipo che è
disponibile una freccia che dice sia
qualcosa
quindi il risultato di qualcosa è o il
digitare a sinistra o il tipo sul
proprio così, in questo caso, posso dirlo
questa funzione ritorna o no
applicabile che in questo caso è solo un
oggetto semplice o doppio ok allora quando
Voglio restituire il risultato che faccio entrambi
a sinistra e il risultato effettivo sia giusto
e il risultato effettivo quindi questo comincia a
sii carino perché ora non lo faccio
abbattere tutto il codice di questo codice
che volevo scrivere e solo io
specificatamente restituito il tipo effettivo
che voglio fornire ora inizia questo
per fornirmi alcune altre cose
che entreremo come per esempio voi
sapere è lasciato è lasciato
non ritorna solo al reale
ADT per me, ma restituisce anche
funzionalità aggiuntiva che poi io
può chiamare e passare ad altre funzioni e
tipo di fare questo pipelining che abbiamo visto
precedentemente come uno di loro quattro
le istanze sono lasciate a sinistra mi dice se
il valore restituito è lasciato o è
se esiste il diritto mi dirà se
il dato un predicato esiste se il
il valore è lasciato e quindi da quel momento in poi
continuare a fare altri tipi di esecuzioni
così spostandoci dalle eccezioni otteniamo
questo tipo di tipi di ritorno come noi
può usare un tipo di uso simile per definire
come vogliamo restituire i valori, ma lì
sono momenti, ad esempio, che voglio
in realtà attenersi al concetto di
eccezioni e c’è un altro tipo che
fa parte anche della freccia che viene chiamata
prova che mi permette di fare esattamente questo
proprio così, in questo caso, quello che prova è
essenzialmente dice che questa firma
questa funzione può restituire uno
eccezione o una stringa giusta così è
essendo esplicito ora si sta allontanando
mentendo a me giusto perché se questo
era solo una stringa quindi so che questo
sta per restituire solo una stringa ma in
questo caso sta dicendo no che posso
in realtà fallire quindi è un po ‘come
controllate le eccezioni tranne che tu non ne hai
fare casino con tutti quelli controllati
eccezioni quindi in questo caso dico di ritorno
una prova e la prova se sai se è se
è un URL valido quindi restituisce il
i contenuti altrimenti generano eccezioni così
ora se ottengo la pagina con il tiro e io
passare in qualche modo
e io corro questo non lo farò
qualsiasi cosa perché è assolutamente bene
è solo restituire il contenuto intendo se
Faccio una linea di stampa qui sarebbe tornato
restituisce il valore dei contenuti ma
essenzialmente è assolutamente buono ma
ancora una volta torniamo a questo non è solo
sull’introduzione di un tipo con niente
altrimenti sta introducendo un tipo con altro
funzionalità una di quelle cose è per
esempio ottieni o destra così ottieni o altro
ciò che questo mi permette di fare è dire ok
questo valore o altro se non puoi ottenere
questo valore se viene generata un’eccezione fare
qualcosa con questo, così posso dire
linea di stampa e quindi si conosce l’errore
è successo giusto e cos’è questo?
un lambda così da quando è un lambda è
prendendo un parametro se guardiamo al
parametro di get o elles sta prendendo un
buttabile qual è il gettabile è il
esatto buttabile che stiamo lanciando
dato che è un singolo parametro che posso
riferiscigli come non devo essere
esplicito quindi se eseguo questo e passo
un M se eseguo questo e passaggio in un
stringa vuota quindi che sta per dire
errore si è verificato e sta andando a dirmi
la vera eccezione che è stata
lanciato ma non sta lanciando il
eccezione per me se voglio potrei
quindi lanciare quell’eccezione per qualunque cosa
ragione ma mi sta permettendo di farlo
gestisci con garbo queste situazioni okay
in modo da poter continuare a utilizzare le eccezioni
ma puoi farli in un altro
dì che conosci un aspetto più sottile e pulito
Va bene così via un’altra cosa che sei
avendo catturato in cui sei tutto
familiarità con null o no null così
se scrivo una stringa e quella stringa è
nullable giusto e se lo faccio se s non lo è
null quindi stampa linea qualcosa questo io
può fare in stenografia semplicemente facendo
qualcosa come tutti i punti della linea di stampa
lunghezza per esempio questo posso fare in
stenografia utilizzando l’operatore sicuro così
Posso fare al sicuro
giusto questo è come fare un if
essenzialmente è come se non fosse nulla
allora fai questo adesso questo è costruito
della scatola di Colleen è la cassaforte
operatore in molte altre lingue come
ad esempio Java hai l’opzione giusta
dove puoi sostanzialmente dire se non lo è
null allora fai qualcosa ma quel concetto
di opzione non deve esistere solo per
il caso di null il concetto di opzione
è più ampio che esiste per
qualcosa che ha un valore o non ha un
valore altrimenti noto anche come forse così
per esempio qui ho una funzione
restituisce un’opzione di stringa che
essenzialmente significa è il valore è
restituire un valore reale o è
restituendo vuoto vuoto può un giorno essere
mappato a null nel caso di safe
operatore altre volte può essere solo
considerato vuoto e quindi posso fare
le cose vanno bene se è il risultato
definito c’è ancora un valore che dà
io non solo questo concetto dei dati
classe ma un sacco di novità
funzionalità su questo diritto di classe dati
quindi ora posso dire se il valore è definito
fare qualcosa, ma che altro può fare così
per esempio qui qui quello che ho è un
divisione delle funzioni che ora diventa totale
ricorda la funzione iniziale che avevamo
quello era parziale ora questo diventa totale
quindi in questo caso quello che sto dicendo è
dividi due numeri opzione int e if
è maggiore di 0 quindi restituisce il
valore lo chiami con un solo tu dici
svuota solo il valore altrimenti ritorna
vuota e poi nella mia, quando ho comunicato
posso dire quando il risultato non è la linea di stampa
questo non funzionerà altrimenti la linea di stampa
risultato e T si riferisce al tipo effettivo
il valore che sta tornando ok così ora io
avere questo caso in cui posso cambiare
tra nessuno e alcuni ma facciamo
continua con questo perché questo tipo
del modello inizia a diventare ingombrante
giusto perché se sto iniziando a lavorare
con questi tipi di opzioni e ogni singolo
volta che ho questo tipo di opzione che ho
fare se questo
è vuoto fallo se non è vuoto
che questo comincia a diventare ingombrante
come qui sto prendendo un int immaginare per
istanza che volevo prendere un’opzione
come input cosa dovrei fare io
Dovrebbe venire qui e dire se tu
sapere se lo cambiamo in opzione di int
ora devo dire se X è definito allora
fare qualcosa con il risultato altrimenti
fai qualcos’altro e quando inizi a
avere tutte queste funzioni che iniziano
per prendere le opzioni e si inizia a cambiare
questi diventa abbastanza ingombrante
codice boilerplate e ovviamente questo è
già risolto per te giusto perchè in
nella freccia puoi avere la capacità di
avere questo costruito in cui è essenzialmente
una mappa una mappa è un concetto generale che
viene dalla programmazione funzionale che
è chiamato un funtore che essenzialmente
sa come lavorare con un valore applicare a
funzione per quel valore, quindi cosa faccio qui
è che ho una funzione chiamata
opzione quadrata che prende un reale
opzione e dico mappa che con dentro
i valori in modo che la mappa sotto le copertine ora lo sappia
che se non è vuoto esegui questo
predicate su quello se è vuoto allora
non fare nulla, giusto e ancora mappa
mi restituisce la capacità di iniziare a fare
altri tipi di concatenamento giusto così qui io
ho una mappa in questo caso ho tripla
opzione in modo da poter passare in opzione di difficoltà
vuoto quindi ora questo non è essenzialmente
andando a restituire qualcosa perché è
tripla opzione su Mt non restituisce nessuno
giusto se inserisco un valore qui per
istanza tripla opzione di soli tre
solo tre se ho sbagliato nel modo giusto
dovrebbe restituire circa 27 ok e poi io
può effettivamente ottenere il valore reale da
questo e possiamo continuare a costruire
questo e prendere ulteriormente così per esempio
qui introduciamo un’altra cosa che è
mappa essenzialmente piatta che è di nuovo molto
comune nella programmazione funzionale e
la mappa piatta è l’idea che ora non lo sono
andando
per restituire solo il valore che sto per
restituire un’opzione e procedere
quello e il risultato finale di quella mappa piatta
deve essere un’opzione effettiva che è
restituito questo poi mi consente di prenderlo
al livello successivo che è qualcosa
che si può avere sentito molto comune in
programmazione funzionale che viene chiamata
si lega bene e se ne hai mai sentito parlare
la tabella del tipo di monade o il tipo
monade a monade classificata ha questa funzione
chiamato bind che essenzialmente mi permette
per fare le comprensioni monadiche con questo
generalmente significa prendere tutto di questi
diverse operazioni che si riferiscono
restituendo questi tipi a tutte queste monadi
di queste opzioni provate o queste sono
esempi di monade proprio così abbiamo appena
ho visto monadi senza dire monad e
combinare questi in operazioni così per
istanza qui ora posso iniziare a fare a
sequenza di operazioni che sono
indipendenti che non dipendono da ciascuno
altro e poi combinare questi e ottenere
risultati e hanno tutti gli errori
gestione effettuata per me dietro le quinte
nel modo molto più bello va bene così sia
opzione vincolante prova tutti questi sono alcuni
delle cose che sono disponibili a Aero
se sei interessato, dai un’occhiata
la biblioteca e inizia a giocare con quello
che ti dà delle belle cose fuori
la casella ora una cosa voglio anche
toccare brevemente prima di finire quale
è molto funzionale in termini di Kotlin
alcune altre cose che puoi fare con
funzioni in comune, quindi lasciami iniziare
con te tutti conoscono il
concetto di un dominio specifico DSL giusto
diritto di lingua che la spiegazione di
una lingua specifica per il dominio è una lingua
questo è specifico per un determinato dominio
lì vai così spero di averlo per esempio
una configurazione di classe che dice per
l’istanza ha una porta stringa una stringa a
stringa host e diciamo che ha una porta
informazioni di tipo port e quindi I’m
andando ad avere una porta di classe che ha per
istanza un valore e poi è lo è
sicuro booleano giusto quindi questi sono VAR
perché ho intenzione di impostare
ora nel chiamare ci sono molti modi per
inizializza bene quello che vuoi
non fare come Val
configurazione configurazione facciamo solo
imposta alcuni parametri di default qui così
lo faremo è che la porta è port e
allora qui diremo è falso scusa falso
e int è uguale a zero giusto per poterlo fare
fai la configurazione e poi qui fai
configurazione e quindi sai impostare il
mi dispiace configurazione di configurazione Val e poi
imposta l’host host e quindi imposta un valore
ecc. oppure potresti fare qualcosa del genere con
C e poi dentro C ora hai accesso
per ospitare e poi si ottiene l’accesso alla porta
quindi qui dentro faresti con il porto
e poi dentro qui diresti per
esempio sai che il valore è uguale a 90 ed è
sicuro è uguale a vero e quindi host potrei
metti ad esempio uno due sette zero zero
uno adesso questo è bello il problema
è che questo è un po ‘come un po’
un po ‘brutto perché ho finito con questo
qui a destra e quello che voglio fare è come
se per esempio si chiama config
quello che voglio fare è perché non riesco a liberarmi
di questo e solo fare una cosa del genere
giusto e un po ‘come creare il mio
configurazione DSL
proprio come JSON, proprio come niente
altrimenti come ho creato una configurazione
file per la configurazione delle porte ma
immagina che questo potrebbe essere un affare
logica o qualsiasi altra cosa come le informazioni fiscali
voglio essere in grado di avere questa capacità di
scrivere questo tipo di codice e avere
completamento e hanno controllo di tipo e
tutto questo per me posso farlo in
Kotlin beh, in realtà possiamo così ciò che è
questo è esattamente ciò che stiamo facendo
qui questo è essenzialmente un oggetto giusto
la configurazione in questo caso è un oggetto e
cosa sto cercando di fare se guardi il
schema sto mettendo alcuni lambdas quindi cosa
Sto provando a fare è invocare quell’oggetto
posso farlo a Colleen, posso farlo ?
avere una classe per esempio Q giusto e
allora posso venire qui e creare un nuovo
classe a proposito
questo non è vero in realtà
mio amico stava facendo un discorso dal vivo
giorno c’erano due di loro sul palco e
stava dicendo che sai che uno di loro lo è
come scrivere l’altro sta facendo
parlando lui dice ah hey lui è come
Richard crea una coda per me, quindi cosa
Richard fa lui crea una coda
chiamato foo code right e l’altro
è come dire che ora abbiamo questo
coda di influenza e lui dice che Richard creare un
seconda coda per me che cosa fa esso
crea un caso, YouTube, ecco perché
non si dovrebbe mai assegnare un nome al foo roba così
se ho questo foo posso ora invocarlo
come posso invocarlo vedi che ho appena colpito
alt entrare è così che lo invoco così che cosa
è questo che chiamiamo questo pazzo
in pratica quello che voglio fare è creare un
operatore in Kotlin che è chiamato
invoca appena posso quello che posso ora
invoca questo oggetto quindi se posso farlo
là facciamolo qui creiamo un
invocazione ora quando invoco non lo siamo
quale parametro dovrei passare?
qui vediamo quindi a cosa ho bisogno di accedere
Ho bisogno di accedere all’host e porto ciò che è nostro
ospite importa le loro proprietà di
configurazione in questo momento ciò che è un alto
la funzione di ordine in Kotlin è una lambda
giusto che prende un lambda ciò che è un
funzione di estensione è una funzione posso
passare le funzioni di estensione in ordine elevato
funziona al college sì, puoi farlo
è unico per chiamare il concetto è
chiamato lambda con i ricevitori così posso
passare in un lambda con ricevitore qui
che il tipo è in realtà un’estensione
funzione per la configurazione, quindi questo
è una funzione di estensione a
configurazione dato che è un
funzione di estensione per configurarlo
significa che ha accesso a
proprietà di configurazione che significa
che improvvisamente questo non è più letto e
Farò esattamente la stessa operazione qui
continua a dare la stessa cosa così farò
funzione di cosa ho bisogno di accedere a qui
porta destra quindi farò l’unità portuale e poi
vieni giù voilà ho il mio caro
così giusto così ho fatto DSL guidato
sviluppo ho iniziato con quello che ho
volevo e ho guidato dentro e fuori usando
alt-entra ora non ho nemmeno bisogno di sapere
Colin, ma il punto è qui ovviamente
Ho appena fatto un piccolo DSL che è
specifico per un’impostazione di configurazione ora
potresti non andare a questa estensione per farlo
qualcosa per la configurazione ma l’idea
ecco che puoi davvero abbracciare il
capacità di usare le funzioni del tribunale
e lambda con i ricevitori e il
possibilità di invocare oggetti e creare DSL
per le parti specifiche del tuo
domanda perché intendo se lo sei
facendo per esempio cose come dominio
design guidato proprio una delle chiavi
aspetti del design guidato dal dominio è
avere un linguaggio ubiquitario che è il
la stessa lingua che usi nel tuo codice
corrisponde a quello del dominio aziendale e
ora puoi iniziare a fare leva su di te
sapere come creare le sl non riguarda solo
creando HTML la nuova versione di quello
che non è necessario che si chiama
markdown ok
comunque questo è tutto il tempo che abbiamo per
ora non so se abbiamo tempo per
tutte le domande se non sono un po ‘in giro
po ‘più tardi comunque, quindi una domanda
quindi solo una breve domanda l’ultima parte
perché non è quello di default c’è un po ‘
inconvenienti di avere quella funzionalità
quale parte non è predefinita o dispone di un DSL
sul tuo sul tuo oggetto, perché dovresti
dobbiamo perché dobbiamo implementare
quei metodi vabbè intendo sì, intendo
prima di tutto non tutti lo faranno
voglio avere un DSL sul loro oggetto giusto
e questo è un sacco di codice aggiunto
che deve essere generato in
un po ‘di senso in secondo luogo
tecnicamente sarebbe solo possibile farlo
usando un po ‘ come un professionista
post-elaborazione come usare capped for
istanza una chiamata in-house giusta quale tu
può analizzare il tuo codice base e basato su
che genera qualche DSL ma di nuovo lo è
come se non pensassi che sarebbe qualcosa
che si desidera avere ogni singola classe
avere questa capacità di essere onesto con te
ok grazie grazie
[Applausi]
tu
tu
benvenuto a questo discorso su funzionale
programmare in Kotlin quanti di voi
conosci Carl a Nizza quanti di voi hanno
mai visto come molti di voi non hanno mai
sentito parlare mi sono vicino a te nel torto
camera
ok, chi ha fatto Kotlin prima di maggio?
17 ° 2007, adolescente giusto, è stato il giorno
che Google mi ha annunciato riguardo
Scozia, che sentito parlare dopo che
annuncio e non prima di un bel sì
pochi di voi come questo confermano
che ho sprecato sei anni della mia vita
parlando di Katli grazie comunque
Avrei potuto semplicemente aspettato e aspettato per
loro di dire qualcosa così ho intenzione di dare
una breve introduzione in termini di
programmazione funzionale con Kotlin cosa
c’è quello che non c’è ciò che puoi
utilizzare tramite terze parti e sì solo
dai abbastanza per poterlo forse
guarda un po ‘di più se lo sei
interessato come questo non è la sessione
per voi davvero imparare qualcosa
destra mi dire come seriamente in conferenza
i discorsi non riguardano l’apprendimento, sono così
Lo dico comunque
Mi piace sempre iniziare con perché è così
Inizierò con il motivo per cui qui a prendere un
guardare a questo codice non giudicarmi
era solo il codice demo che è simile
tutto il codice che scrivo e dimmi al più presto
come sai cosa fa alzare il tuo
mani e non gridare non mi piace dire oh
So cosa fa ti dirò solo
solo alza le mani e dimmelo
so cosa fa e se tu fossi nel mio
laboratorio di ieri non alzare la mano
perché sarebbe ingiusto
Qualcuno sa che abbiamo ottenuto uno due tre va bene
grazie metti giù le mani giù sono
bene
dai un’occhiata a questo alza le mani
quando sai cosa fa bene, quindi si
alziamo le mani molto più velocemente così
quando la gente dice perché funzionale
programmazione
bene perché è giusto, è così
la cosa hipster da fare oggigiorno ma
anche perché è potenzialmente più facile per
per capire bene l’idea alla base
la programmazione funzionale è da rimuovere
certe cose e aggiungere certe cose
questo rende il nostro codice un po ‘più
comprensibile e comprensibile quindi se
si guarda a questi due pezzi di codice che
fa qualcosa è esattamente lo stesso
come fa qualcosa sicuro che il
il tipo di reso potrebbe essere diverso ma il
il principio di ciò che fa è esattamente il
lo stesso e se guardi dai un’occhiata a questo
codice quello che stai guardando è un intero
un sacco di codice in cui nella tua testa tu
devo avere questo intero modello mentale di
che cosa esattamente sta succedendo proprio devo
avere un piccolo magazzino qui
la mia cache per memorizzare le mie variabili in cache
fuori quello che sta succedendo con quelli
le variabili aumentano mentre vanno
lungo
capire cosa stanno facendo le operazioni
cosa sta facendo ciascuna operazione se
è una dichiarazione se è un
espressione se è ciò che è
restituendo il negozio e provate e
fondamentalmente diventa un compilatore giusto e
diventare l’applicazione per interpretare questo
mentre con questo è essenzialmente
la stessa cosa è l’unica differenza
che ne ho estratto qualcosa
funzionalità in qualche altra cosa
che si chiama una funzione giusta e
Ho dato a quelle funzioni dei buoni nomi così
ognuno di noi capisce cosa sia
concetto di gruppo-per mezzo anche se loro
non capisco la sintassi di Kotlin
o non capiscono il concetto di
ciò che il gruppo reale funzione è però
loro praticamente sanno cosa significa
giusto e coppia tutti sanno che coppia
fa e tutti sanno cosa non tu
forse non sapete cosa fa la mappa ma
generalmente non appena capisci cosa
queste funzioni fanno questo diventa molto
più facile da seguire e questo è uno dei
obiettivi della programmazione funzionale intendo
ogni persona ha il suo ha il suo
obbiettivo
programmazione funzionale ma i benefici
che ho trovato nella programmazione funzionale
stanno essenzialmente alzando il livello
dell’astrazione che fa quelle astrazioni
essenzialmente funziona e quindi usa
quello di scrivere più espressivo e
codice conciso e c’è un importante
fattore qui perché conciso no
conduciamo sempre a ciò che è comprensibile
non può avere il codice conciso prendere uno di
quelle lingue esoteriche su Wikipedia
che inizia con una b e termina con a
e tu sai che è molto
condensato ma non è comprensibile così
si tratta di mantenere il codice che è
diritto comprensibile e questo è dove io
pensa a quello che chiameresti il
lo sai perché spesso le persone dicono
se sto facendo una programmazione funzionale
da dove comincio dove finisco ciò che è
la si conosce il il l’ultimo
epifania della programmazione funzionale dove
è solo il viaggio che ognuno di loro
tempo si inizia a capire di più e
di più e poi quando capisci questi
le cose sempre più sono lì
comodo e questo è dove puoi
stai bene così ora in termini di Kotlin cosa
faremo è un po ‘come dimostrarlo
gli aspetti funzionali di Colin perché
Colin come sai è se non lo sei
familiarità con Colin Colin è un
linguaggio di programmazione orientato agli oggetti
con costrutti funzionali cosa fa
ciò significa che è anche a
linguaggio funzionale ciò che è funzionale
linguaggio bene ci sono molte definizioni
dipende da chi chiedi se chiedi a
Programmatore Haskell generalmente lo faranno
dite che è solo Haskell se chiedete a
programmatore f-sharp diranno che è solo
F forte in genere il concordato
il sentimento è quel qualsiasi linguaggio quello
dà supporto alle funzioni come
i cittadini di prima classe possono essere considerati a
linguaggio funzionale , quindi cos’è
cittadini di prima classe che l’abilità
che posso essenzialmente avere funzioni
che posso passare in giro come parametri
che lascia il posto a funzioni di ordine superiore
la capacità di avere forse una sorta di
immutabilità in termini di stato
gestione ecc questa funzione è chiamata
in un linguaggio funzionale è di gran lunga
Ovviamente altrimenti cosa sto facendo
qui, come stai andando bene?
sai che non parlerò
programmazione in chiamata funzionalmente e
usare qualcosa come non so VB così
è il motivo per cui quell’account è funzionale
perché nel chiamarti hai l’abilità
per fare certe cose okay, ma andiamo
passare attraverso le basi nel caso in cui non lo sei
così familiare con Cortland qui
mi permetta di creare un nuovo file e non un
file zero è finito qui e lo faremo
colonna file vivi me Adoro nominare roba
va bene così e quello che vedremo qui è
essenzialmente qualche sintassi per Kotla ora
chiamando object-oriented quindi ho a
il cliente di classe ci va che è un
Classe hai appena dichiarato una classe in
personalizzato in Kotlin e posso creare un
funzione anche in Cortland
faccio stampare un messaggio e avrò un valore
che sto passando e poi posso te
sai fare quello che voglio con quello
parametro okay quindi questa è la base di a
funzione in nel chiamare una funzione da
l’ unità restituisce di default quindi se non lo fai
specificare l’unità si presume che sia
restituire unità di unità è esattamente la stessa
come vuoto tranne che non è vuoto lì
go che è la mia spiegazione c’è la
la differenza è che l’unità è in realtà un
oggetto quindi se non sei di nuovo familiare
l’oggetto è in Cortland che possiamo avere
classi e puoi creare istanze di
classi e poi puoi anche avere
oggetti che sono simili a Java
Script va bene e ti prego ogni volta che dico
Java Script pensa alle cose buone
di JavaScript non faccio mai il
confronto di JavaScript come in tutto il
diavolo che JavaScript va bene così è
un po ‘come JavaScript in termini di un
oggetto ora questo in realtà significa che è un
chiama e restituisce qualcosa in effetti tu
so se faccio quattro se faccio stampe dei risultati
messaggio e passando qualche valore e poi
Faccio una linea di stampa di risultato questo è
andando a restituirmi un valore che è
in realtà unità destra in modo da poter vedere quello
mi restituisce l’unità ora a posto
chiamarti puoi effettivamente avere una funzione
indica che una funzione non ritorna mai
e lo fai dicendo questo
gira niente e quando dico nulla che
letteralmente non significa niente, quindi scrivi
niente e poi quella funzione mai
Restituisce così si può vedere che questo
subito dice che questo bene in quello
caso appena ancora quello non funziona e
qui puoi vedere che questo è
codice irraggiungibile giusto perché da tutti
account ora interpreta il compilatore
che quella funzione non arriverà mai
ritorna così ti chiedi perché dovrei mai
voglio farlo bene per esempio
c’è una funzione integrata nel
libreria standard che è chiamata a fare
implementalo e se vai a fare te
posso vedere che essenzialmente lancia un no
implementato eccezione di errore e
non restituisce nulla di buono quindi se qualcuno mai
ti chiede in cosa consiste l’ oggetto di livello superiore
Kotlin si chiama any e ti chiedono
qual è quello che è in fondo a te
non dire niente e non ti trasformi nel
la verità e se non lo sai basta dire
niente comunque bene e sì pensare
hai ragione
okay, chiamandoci cerchiamo di essere concisi
Voglio dire, puoi vedere quanto sia concisa una classe
è così che posso anche fare un divertimento ad esempio
somma se scrivo un X int y int non lo faccio
fare qualcosa come questo ritorno X
inoltre y posso farlo molto più breve di a
funzione di espressione singola e giusta
restituire il valore ci inferenza di tipo
ora mi consentirà l’inferenza del tipo
sapremo il tipo di ritorno sulla base del
tipi di parametri e posso solo esprimere
ogni funzione essenzialmente come un singolo
funzione di espressione considerando la maggior parte di
noi ora abbiamo monitor 4K che non abbiamo nemmeno
hai la limitazione di 80 colonne così tu
può davvero davvero molto tempo
funzioni di espressione singola
bene ora questo è grande, ma uno dei
cose che ho detto in giro catturate dal
modo che era una battuta sulla colonna così
è solo che non mi interessa se non lo fai
ridi delle mie battute ma a volte delle persone
sono come se dicesse davvero qualcosa
è stupido sì, l’ho fatto a Carlin
sai che non potresti considerarlo a
linguaggio funzionale se non avessimo avuto
la capacità di aggirare le funzioni
che essenzialmente porta a un ordine superiore
funziona così ora ho un ordine più alto
funzione in Kotlin posso scrivere più in alto
ordine e poi questo prenderà
un
un parametro e quindi posso dire che sta andando
prendere una funzione e poi passare
la vera firma della funzione così
in questo caso dirò che questa funzione
è un int e richiede una int Internet
e restituisce un diritto int così essenzialmente
quello che sta dicendo è che questo è
ciò che questo è essenzialmente sta prendendo un
funzione che prende due parametri di
digita il numero intero e restituisce un intero okay
dal modo in cui puoi renderlo davvero fantastico
invece di scrivere funk, posso davvero
metti lambda a guardare questo
Metterò che è bello o che piacerebbe se
non impari altro in questa conversazione
so come digitare lambda ora, così che io sia
non ti dirò come farlo se non tu
sapere che è possibile no è solo con
un modello dal vivo comunque così questo è
essenzialmente il lambda che sta passando
in una funzione di alto ordine questo è un alto
funzione di ordine che sta prendendo un
parametro che è un’altra funzione così
ora posso chiamare questo ordine superiore e io
può passare nel lambda qualsiasi cosa
prende questa firma per cominciare con I can
passare in una funzione esistente voi
dereference che si fa riferimento che nel
Kotlin usando solo due punti del colon
giusto così qui sto passando nel
somma funzione perché corrisponde alla nostra
firma in modo da poter passare questo se io
voglio davvero passare un lambda e
lì sto avendo un lambda che è essere
passato a destra e cosa mi sta dicendo
questo è essenzialmente questo suggerimento
che puoi farlo in modo più efficiente
modo o un modo più carino o più idiomatico
in Kotlin che è questo se è l’ultimo
parametro per una funzione è un altro
funzione Non devo allegarlo
le parentesi destra così posso solo escludere
questo dalle parentesi e metterlo
al di fuori delle parentesi destra e il
le parentesi sarebbero andate qui ora dato che io
non ho altri parametri che posso
lascia cadere anche quelle parentesi perché
sono ridondanti a posto a Collin se tu
puoi scegliere un singolo parametro lambda
anche metterlo su più righe così da te
può fare una cosa del genere e se si
avere funzioni di ordine superiore che sono
solo con un singolo parametro, quindi abbiamo a
ospedale che prende solo un singolo
parametro che cosa puoi fare è scrivere
L’ospedale di fare X è X più che puoi
essenzialmente basta scriverlo più y va bene così
è possibile utilizzare lambdas a parametro singolo
con esso il nome invece di essere esplicito
questo mi dà il simile se lo sei
familiare con groovy è essenzialmente
la stessa cosa, così questi sono come
dichiari le funzioni di ordine superiore e
come puoi essenzialmente come lo sai
hai il tuo adesso nella lingua
di per sé non abbiamo alcun ordine superiore
funzioni in quanto tali abbiamo tutto ciò in
la libreria standard che è molto
piccola biblioteca che fa parte del Kotlin
per esempio che viene eseguito come tempo di esecuzione
se faccio numeri equivale a 1 a 100 ho a
un sacco di nuove funzioni qui a destra
così per esempio il filtro che faccio filtro
5 è uguale a 0 e quindi su questo lo mapperò
a 20 e poi su questo per esempio io
può fare un per ciascuno e stampare la linea
risultato attuale va bene e ora ottieni questo
bella piccola pipeline meravigliosa di
funzioni e puoi dire guarda che sto facendo
programmazione funzionale ok e poi in
circa 10 anni andremo a questo e
saranno 60 linee e ci chiediamo dove
abbiamo sbagliato e lo chiameremo
codice funzionale aziendale ok ma non farlo
preoccupatevi per quel momento qualcos’altro lo farà
vieni in giro che lo promuoverò
cosa avrà sempre un lavoro in questa vita
a destra avremo sempre un lavoro giusto che
fanno parte del distruggere le cose che noi
più tardi vieni a sistemarci bene, quindi tutto
di questi fanno parte dello standard
libreria che è stata definita come
l’estensione funziona quindi è molto piccola
e disponibile su un intero gruppo di
cose diverse
funzioni di estensione per quelli che sono
non hai familiarità con Kotlin
qualsiasi classe tu possa avere qualsiasi estensione
tipo di nuova funzionalità, quindi se ho un
Classe stringa che voglio fare un a
caso di cammello posso scrivere sul caso cammello e
ora fondamentalmente questo è implementato ora
quello che succede è che se ne prendo qualcuno
stringa ho la – funzione caso cammello
giusto così questo è ora disponibile per me
ovunque sia definito in
pacchetto quindi questi filtri
non che vedi qui sono tutti
essenzialmente funzioni di estensione su
iterables generica timbrels così loro sono
disponibile praticamente tutto okay
questo è gentile e ci dà anche un
un sacco di funzionalità all’interno del
libreria standard su stringhe e divertimento
e funzioni di estensione intorno a tutti
la roba degli archi , quindi è abbastanza
che è abbastanza decente anche una cosa
che useremo quello che farai
l’avviso è buono a Kotlin che puoi
in realtà chiama le funzioni all’interno della correzione
notazione quindi se ho un’estensione
la funzione che possiamo chiamare è la stessa di
che accetta un parametro che è valore
che controlla se questo è uguale al valore
e questa è l’ istanza attuale di me
puoi scriverlo così mi conosci
come me e anche io posso scriverlo
notazione infix va bene posso scrivere come
che ignora l’errore quindi è uguale a
destra così si aggiunge la correzione e poi in
puoi scriverlo essenzialmente allo stesso modo
così questo sembra bellissimo proprio questo
non va bene ora prima di tuffarsi di più
dentro ai fini delle funzioni let
mi limito a segnalare un paio di cose
prima di tutto bene qualcuno sa cosa
lambda è che ne ho appena mostrato uno proprio lì
tu vai
cos’è una funzione anonima è a
lambda, quindi se vai se vai
a Wikipedia che è la fonte di
la verità e tu dici il bicchiere di whisky
Amo il whisky e tu dici di sapere
lambda e tu scendi oh guarda che ho capito
è giusto lambda lambda computers in
scienza del computer
dite che avete comunque scritto in Wikipedia
quel lambda altrimenti noto come un
la funzione anonima è blah blah blah ora
in tutte le lingue i lambda sono uguali a
funzioni anonime , tranne in chiamata
colonna in realtà abbiamo anonimo
funziona pure bene così se vuoi
fare
funzioni anonime che puoi effettivamente
scrivi qualcosa come questo qui
quindi per esempio se ho il mio più alto
ordina la mia funzione di ordine superiore proprio così
invece di passare in una lambda così
Posso passare in un divertente XY e poi dentro
di che per esempio non ritorno X più y
okay e perché questo mi dà un e e
unità e oh eccoci andare così così è
un diverso per un lambda in Kotlin così tu
avere il concetto di funzione anonima
allora hai il concetto di lambda e
questo è importante perché i lambda hanno
certi comportamenti che è importante
per voi per sapere così per esempio se io
avere una funzione che è un contenitore e
Non intendo la finestra mobile perché c’è un modo
più contenitori e sono al giorno d’oggi e se
Passo per esempio un lambda qui
che prende ad esempio un int e
restituisce un diritto int e quindi lo farò
qualcosa come te conosce bene i numeri
i numeri equivalgono a 1 a 100 e poi lo farò
numeri per ciascuno quindi se numeri è
divisibile per 0, ho intenzione di fare a
tornare ok così se io, se si dà un’occhiata a
quel codice e facciamo solo no
bisogno di questo quindi dare un’occhiata a quel codice
giusto questo è un lambda
Espressione in Kotlin che sono
passare a per ciascuno per ciascuno è un
funzione di ordine superiore e io ti dico
ritorno e poi scriverò qui per
esempio stampa linea ciao a destra e poi
formattiamo questo, quindi scriverò
stampa linea ciao va bene ora se io
dai un’occhiata se ti direi se corro
quel contenitore del codice che cosa farà
stampare sullo schermo
cosa diresti intuitivamente che sia così
o andando a stampare ciao o niente
quale sarà il buongiorno ciao
ciao sono io no
quindi sì no, in realtà non stamperà
ciao non mi piace mai come questo è
Sono completamente controintuitivo, giusto io sono dentro
il foraggio sono in una lambda che farò
un ritorno perché non stamperà ciao
beh, la ragione per cui non ci sarà
ciao è perché a Kotlin quando tu
ritorna da una lambda fai un non-locale
ritorno non si effettua un ritorno locale così
ciò significa che questo tornerà
al di fuori della funzione contenitore e
Mi piace come mai perché è questo che prendiamo
uno sguardo all’implementazione di ciascuno
dare un’occhiata all’implementazione per
ognuno è in loop su elementi è
tuttavia, solo una funzione di ordine superiore
ha questa piccola cosa qui
chiamato inline in questo momento è in linea
parola molto elaborata per copia-incolla così quando
in realtà invochi ciò che sta per succedere
capita che sta per copiare e
incolla quel codice nel contenuto reale
il codice chiamante quindi non sta andando
avere come una chiamata stack di chiamate
un’altra funzione che sta per copiare e
incolla quel codice così non c’è esterno
funzione c’è solo una funzione
che è un contenitore e quando fai un
ritorno uscirà da quello
contenitore giusto cosa succede se non lo faccio
avere una funzione inline quindi se lo sapessi
dichiarare la mia funzione qui o un
funzione inline a cui non sono destinato
ognuno che non ha in linea te
non può fare un ritorno locale non locale
torna se scrivi di ritorno qui è
ti darò un errore ora se vuoi
in realtà fare un ritorno locale tornando indietro
alla funzione anonima invece di
passando in una lambda puoi quindi passare dentro
una funzione anonima come abbiamo visto qui
in questo caso il rendimento verrà effettivamente eseguito
quello che viene chiamato il ritorno locale così
tornerà al contenitore in un altro modo
è se non vuoi farlo, puoi farlo
usa le etichette che sono essenzialmente le
possibilità di chiamare il ritorno al lambda così
se questo lambda
causa per ciascuno quindi questo se questo
la funzione è chiamata per ciascuno quindi questo
ritorno sarebbe per ogni diritto se
questa funzione si chiama Jo e lo farà
essere restituito a Jo okay no questo sta andando
alla domanda è se sta andando a
stampa ciao quattro volte no sta andando a
ripetilo nessuno lo fa oh
sono miei ora cambia completamente
tutto bene comunque grazie ciao così
sì no che doveva essere al di fuori di
il foraggio va bene così ora lo faremo
interrompere le funzioni per un momento l’altro
cosa che abbiamo nel cotone è il
capacità di avere immutabilità l’abilità
avere immutabilità sono solo un poeta
oggi non sono così se ho una classe dati
ad esempio Val customer string e Val
la stringa del telefono è essenzialmente
cliente buon cliente Vega classe buona
questo è essenzialmente il creare un cliente
DTO per me con un paio di stringhe equivalenti
codice hash ecc. e chiama e ho capito
due proprietà immutabili Val significa
immutabile significa che non posso leggere
e scrivi e poi non posso scrivere a
loro una volta li ho inizializzati così
in generale vuoi stare lontano
mantenere uno stato mutevole uno dei
le premesse della programmazione funzionale è
stai lontano dallo stato e con i dati
classi per esempio è sempre bene
avere proprietà immutabili perché uno di
le cose che rimuoverete da
avere proprietà immutabili è il
concetto di una classe di dati non effettivamente
essere valido, quindi diciamo che tu
avere un cliente e tu quel cliente
ha letto e scrive proprietà ad alcuni
indicare qualcuno che scrive a quei clienti
aggiorna una proprietà bisogna avere un po ‘
ora logica di validazione all’interno del nostro cliente
per verificare se è ancora valido o
non se passi dall’idea che io
non è possibile creare un oggetto non valido effettuare tutto
delle tue proprietà di sola lettura e tu
sappi che una volta creato l’oggetto
è sempre valido e tu
devi preoccuparti di quello va bene ora questo
leggere solo è fantastico perché non posso farlo
qualcosa come i cambiamenti quindi se ho N
è uguale a uno non posso fare nessuna chiamata a me
non posso farlo più perché è così
dicendo che è una vocale che viene letta
solo io non posso fare nessun incarico e noi
avere le stesse cose nelle classi, quindi se io
do Val cliente e inizializzare che
valuta che la proprietà non può essere cambiata
il problema è che ci sono situazioni
dove può essere così per esempio qui io
avere un oggetto e ho una proprietà
chiamato valore che è Val questo significa
che è immutabile significa questo
non c’è modo per me di essere in grado di fare
qualcosa di simile è immutabile okay
questo è anche immutabile tranne che è
non immutabile giusto perché questo è
ha una proprietà con un getter personalizzato
che è possibile in Kotlin ma che cosa
sta facendo in questo caso è in realtà
cambiando tutto il tempo perché è
chiamare una funzione che il risultato finale
di quella funzione non è una costante
espressione quindi nei casi in cui si desidera
evitare questi scenari perché come perché
come non riesco a riassegnare il valore il
il valore stesso è immutabile se lo si desidera
sii esplicito su quello che è dove tu
può usare il Const in Kotlin e indicare
che questo essenzialmente deve essere un
espressione costante quindi deve essere
inizializzato come costante per essere
capace di rimanere veramente immutabile in termini
di ereditarietà nel chiamare di nuovo non lo facciamo
chiudi sai che la tua proprietà ha un
riferimento e quel riferimento è un altro
obiettare che ha proprietà mutabili
non c’è davvero modo di garantire
l’immutabilità fino in fondo a destra
ma altrimenti tu lo sai in questo
caso si possono fare certe cose per
garantire le proprietà in termini di loro
essendo costanti quindi iniziamo ora
entrare in alcune di queste cose che possiamo fare
con queste classi di dati giusto così tanto
di volte in cui scrivi qualche codice tu
dì ad esempio l’ inserimento del processo e il tuo
diritti Non conosco alcuni dati che servono
una stringa e poi dici se i dati sono
non vuoto quindi stampare il giorno della linea o
Dati i dati linea di stampa è buona cosa e
quindi facciamo la nostra gestione generale degli errori
giusto che fa eccezione e noi
in genere, getti un’eccezione come la
livello superiore I è abbastanza buono va bene
va tutto bene, quindi ora questo
va bene, va bene, è davvero fantastico
ma questo fa schifo in che senso
questo fa schifo perché se guardo a quello
firma che firma non è
Garantire mi sta mentendo proprio così
firma dicendo che questa funzione restituisce a
unità non è vero questa funzione può
potenzialmente restituire qualcos’altro è
lo stesso di qualcosa del genere se io
scrivi dividi X int Y int right X diviso
da parte di Y è una bugia a cui hanno mentito
noi tutte le nostre vite perché non lo è
vero perché per 0 che non sta andando a
restituire un numero intero sì, questo è ciò che è
chiamato una funzione parziale in questo
non funziona per tutti i potenziali input
valori rispetto a una funzione totale
quale per tutti i valori potenziali lo farà
lavoro così come posso essere esplicito su questo
giusto come posso dire che per esempio
la voce di processo può effettivamente lanciare un
eccezionalmente bene possiamo usare controllato
eccezioni come in Java
ora sto scherzando o puoi semplicemente usare Java
sapere così in genere alcune persone tendono a
evitare di utilizzare le eccezioni per errore
gestione e fanno qualcosa di simile
risultato giusto così ora creeranno a
classe chiamata
risultato e poi in quello risultati loro
potrebbe avere per esempio una proprietà che
sei a conoscenza della stringa di valori e poi?
avranno un’altra proprietà che è
chiamato errore booleano giusto che poi
diranno che sai se il risultato è
va bene allora tornerò risultato buono e
booleano falso e possiamo usare default
i parametri qui sono di default e in caso contrario
ritornerò
ok ora è bello non è così e se
sei generalmente in errore JavaScript
rappresentato come una e così tu puoi
dedicare del tempo a capire se si tratta di un evento o di un evento
errore quindi in questo caso restituirò un
risultato vero ora cosa c’è di sbagliato in te
ogni volta che ci vai, grazie
Allora, cosa c’è che non va ora in modo che
funziona tranne il problema qui è che se
Ho due parametri o se ne ho tre
che devono essere restituiti come risultato ora
Devo capire a guardarlo
cosa è esattamente nel contesto di a
risultato valido e cosa è esattamente nel
contesto di un risultato non valido che in
questo caso ci allontaniamo da questo e da noi
posso dire hey perché non facciamo qualcosa
altro
perché non abbiamo solo una classe base
che è risultato e quindi posso avere un
classe che è il successo che eredita
dal risultato e ho una classe che è
fallimento che eredita dal risultato due
e perché non posso farlo perché in
Kotlin di default è tutto così finale
ora posso fare ritorno al successo e qui io
può fare fallimento del risultato giusto e poi il
successo fallimento sta per avere un
proprietà che è valore per esempio di
tipo stringa e fallimento avrà
una proprietà di tipo messaggio per esempio
dicendo che il vero messaggio di errore va bene così
ora ho anche più informazioni qui
questo è un messaggio va bene così bene perché tu
può fare anche questa classe annidata
è ancora più bello perché ora posso allegare
in un contesto specifico va bene così ora io
può avere il mio risultato punto e successo
risultato del fallimento e ora mi dà
più informazioni contestuali su quando
è un risultato quando è un fallimento ora
questo è bello il problema è questo
ora arriva il mio amico e va a un file
che non è di proprietà di
la libreria standard e dice Oh data
classe a volte che eredita anche da
risultato proprio qui e ora se noi
ritorna al mio coso qui che ho
appena introdotto una nuova classe che
potenzialmente non so di giusto e
ora c’è un terzo caso, quello che sono
generalmente mostrandoti qui è il
concetto del tipo di dati algebrico che
è essenzialmente un tipo che può essere di uno
tipo o un altro tipo ora in Colleen come
non appena dichiarerai una classe aperta a nessuno
può ereditare da esso se si desidera chiudere
la nostra gerarchia cosa puoi fare è chiamarla
sigillato giusto così invece di aprirti
crearlo dice sigillato e che cosa
significa è che essenzialmente solo le classi
in questo specifico file sono autorizzati a
erediti da questo così in quel senso te
ottieni un po ‘di sicurezza in quello che vedrai
tutti i tipi quindi se torniamo a
vivi me lo puoi vedere adesso
mi dà un errore dicendo che non puoi
più a lungo erediti da a volte ok ora
questo è un modello abbastanza buono
perché posso usare questo più e più
di nuovo a destra invece di poter provare e
allontanarsi dalle eccezioni e spostarsi
verso queste classi di dati che mi consentono
per restituire risultati diversi in base a
successo o fallimento il problema è questo
è un sacco di codice di codice che io
costantemente a scrivere più e più volte
di nuovo così come posso provare a risolvere questo
problema bene è possibile utilizzare per esempio uno
di più librerie è una di queste
chiamato freccia chiunque abbia sentito parlare di freccia
giusto così la freccia ha questo concetto
fondamentalmente costruito nella freccia è un è un
la biblioteca che è disponibile era a esso
era una scusa me era una fusione tra
due librerie chiamate da uno di loro
categoria con una K un’altra chiamata
funzionalità sì avete indovinato che fosse
okay e hanno unito gli sforzi e hanno fatto un
una singola biblioteca chiamata freccia e loro
offrire subito alcuni extra
funzionalità per fare alcuni di questi
le cose sono più fluide quindi una di quelle cose
che forniscono è la capacità di avere
questo tipo di come questo o quei dati
classe va bene così in questo caso ho un
o l’uno è un tipo che è
disponibile una freccia che dice sia
qualcosa
quindi il risultato di qualcosa è o il
digitare a sinistra o il tipo sul
proprio così, in questo caso, posso dirlo
questa funzione ritorna o no
applicabile che in questo caso è solo un
oggetto semplice o doppio ok allora quando
Voglio restituire il risultato che faccio entrambi
a sinistra e il risultato effettivo sia giusto
e il risultato effettivo quindi questo comincia a
sii carino perché ora non lo faccio
abbattere tutto il codice di questo codice
che volevo scrivere e solo io
specificatamente restituito il tipo effettivo
che voglio fornire ora inizia questo
per fornirmi alcune altre cose
che entreremo come per esempio voi
sapere è lasciato è lasciato
non ritorna solo al reale
ADT per me, ma restituisce anche
funzionalità aggiuntiva che poi io
può chiamare e passare ad altre funzioni e
tipo di fare questo pipelining che abbiamo visto
precedentemente come uno di loro quattro
le istanze sono lasciate a sinistra mi dice se
il valore restituito è lasciato o è
se esiste il diritto mi dirà se
il dato un predicato esiste se il
il valore è lasciato e quindi da quel momento in poi
continuare a fare altri tipi di esecuzioni
così spostandoci dalle eccezioni otteniamo
questo tipo di tipi di ritorno come noi
può usare un tipo di uso simile per definire
come vogliamo restituire i valori, ma lì
sono momenti, ad esempio, che voglio
in realtà attenersi al concetto di
eccezioni e c’è un altro tipo che
fa parte anche della freccia che viene chiamata
prova che mi permette di fare esattamente questo
proprio così, in questo caso, quello che prova è
essenzialmente dice che questa firma
questa funzione può restituire uno
eccezione o una stringa giusta così è
essendo esplicito ora si sta allontanando
mentendo a me giusto perché se questo
era solo una stringa quindi so che questo
sta per restituire solo una stringa ma in
questo caso sta dicendo no che posso
in realtà fallire quindi è un po ‘come
controllate le eccezioni tranne che tu non ne hai
fare casino con tutti quelli controllati
eccezioni quindi in questo caso dico di ritorno
una prova e la prova se sai se è se
è un URL valido quindi restituisce il
i contenuti altrimenti generano eccezioni così
ora se ottengo la pagina con il tiro e io
passare in qualche modo
e io corro questo non lo farò
qualsiasi cosa perché è assolutamente bene
è solo restituire il contenuto intendo se
Faccio una linea di stampa qui sarebbe tornato
restituisce il valore dei contenuti ma
essenzialmente è assolutamente buono ma
ancora una volta torniamo a questo non è solo
sull’introduzione di un tipo con niente
altrimenti sta introducendo un tipo con altro
funzionalità una di quelle cose è per
esempio ottieni o destra così ottieni o altro
ciò che questo mi permette di fare è dire ok
questo valore o altro se non puoi ottenere
questo valore se viene generata un’eccezione fare
qualcosa con questo, così posso dire
linea di stampa e quindi si conosce l’errore
è successo giusto e cos’è questo?
un lambda così da quando è un lambda è
prendendo un parametro se guardiamo al
parametro di get o elles sta prendendo un
buttabile qual è il gettabile è il
esatto buttabile che stiamo lanciando
dato che è un singolo parametro che posso
riferiscigli come non devo essere
esplicito quindi se eseguo questo e passo
un M se eseguo questo e passaggio in un
stringa vuota quindi che sta per dire
errore si è verificato e sta andando a dirmi
la vera eccezione che è stata
lanciato ma non sta lanciando il
eccezione per me se voglio potrei
quindi lanciare quell’eccezione per qualunque cosa
ragione ma mi sta permettendo di farlo
gestisci con garbo queste situazioni okay
in modo da poter continuare a utilizzare le eccezioni
ma puoi farli in un altro
dì che conosci un aspetto più sottile e pulito
Va bene così via un’altra cosa che sei
avendo catturato in cui sei tutto
familiarità con null o no null così
se scrivo una stringa e quella stringa è
nullable giusto e se lo faccio se s non lo è
null quindi stampa linea qualcosa questo io
può fare in stenografia semplicemente facendo
qualcosa come tutti i punti della linea di stampa
lunghezza per esempio questo posso fare in
stenografia utilizzando l’operatore sicuro così
Posso fare al sicuro
giusto questo è come fare un if
essenzialmente è come se non fosse nulla
allora fai questo adesso questo è costruito
della scatola di Colleen è la cassaforte
operatore in molte altre lingue come
ad esempio Java hai l’opzione giusta
dove puoi sostanzialmente dire se non lo è
null allora fai qualcosa ma quel concetto
di opzione non deve esistere solo per
il caso di null il concetto di opzione
è più ampio che esiste per
qualcosa che ha un valore o non ha un
valore altrimenti noto anche come forse così
per esempio qui ho una funzione
restituisce un’opzione di stringa che
essenzialmente significa è il valore è
restituire un valore reale o è
restituendo vuoto vuoto può un giorno essere
mappato a null nel caso di safe
operatore altre volte può essere solo
considerato vuoto e quindi posso fare
le cose vanno bene se è il risultato
definito c’è ancora un valore che dà
io non solo questo concetto dei dati
classe ma un sacco di novità
funzionalità su questo diritto di classe dati
quindi ora posso dire se il valore è definito
fare qualcosa, ma che altro può fare così
per esempio qui qui quello che ho è un
divisione delle funzioni che ora diventa totale
ricorda la funzione iniziale che avevamo
quello era parziale ora questo diventa totale
quindi in questo caso quello che sto dicendo è
dividi due numeri opzione int e if
è maggiore di 0 quindi restituisce il
valore lo chiami con un solo tu dici
svuota solo il valore altrimenti ritorna
vuota e poi nella mia, quando ho comunicato
posso dire quando il risultato non è la linea di stampa
questo non funzionerà altrimenti la linea di stampa
risultato e T si riferisce al tipo effettivo
il valore che sta tornando ok così ora io
avere questo caso in cui posso cambiare
tra nessuno e alcuni ma facciamo
continua con questo perché questo tipo
del modello inizia a diventare ingombrante
giusto perché se sto iniziando a lavorare
con questi tipi di opzioni e ogni singolo
volta che ho questo tipo di opzione che ho
fare se questo
è vuoto fallo se non è vuoto
che questo comincia a diventare ingombrante
come qui sto prendendo un int immaginare per
istanza che volevo prendere un’opzione
come input cosa dovrei fare io
Dovrebbe venire qui e dire se tu
sapere se lo cambiamo in opzione di int
ora devo dire se X è definito allora
fare qualcosa con il risultato altrimenti
fai qualcos’altro e quando inizi a
avere tutte queste funzioni che iniziano
per prendere le opzioni e si inizia a cambiare
questi diventa abbastanza ingombrante
codice boilerplate e ovviamente questo è
già risolto per te giusto perchè in
nella freccia puoi avere la capacità di
avere questo costruito in cui è essenzialmente
una mappa una mappa è un concetto generale che
viene dalla programmazione funzionale che
è chiamato un funtore che essenzialmente
sa come lavorare con un valore applicare a
funzione per quel valore, quindi cosa faccio qui
è che ho una funzione chiamata
opzione quadrata che prende un reale
opzione e dico mappa che con dentro
i valori in modo che la mappa sotto le copertine ora lo sappia
che se non è vuoto esegui questo
predicate su quello se è vuoto allora
non fare nulla, giusto e ancora mappa
mi restituisce la capacità di iniziare a fare
altri tipi di concatenamento giusto così qui io
ho una mappa in questo caso ho tripla
opzione in modo da poter passare in opzione di difficoltà
vuoto quindi ora questo non è essenzialmente
andando a restituire qualcosa perché è
tripla opzione su Mt non restituisce nessuno
giusto se inserisco un valore qui per
istanza tripla opzione di soli tre
solo tre se ho sbagliato nel modo giusto
dovrebbe restituire circa 27 ok e poi io
può effettivamente ottenere il valore reale da
questo e possiamo continuare a costruire
questo e prendere ulteriormente così per esempio
qui introduciamo un’altra cosa che è
mappa essenzialmente piatta che è di nuovo molto
comune nella programmazione funzionale e
la mappa piatta è l’idea che ora non lo sono
andando
per restituire solo il valore che sto per
restituire un’opzione e procedere
quello e il risultato finale di quella mappa piatta
deve essere un’opzione effettiva che è
restituito questo poi mi consente di prenderlo
al livello successivo che è qualcosa
che si può avere sentito molto comune in
programmazione funzionale che viene chiamata
si lega bene e se ne hai mai sentito parlare
la tabella del tipo di monade o il tipo
monade a monade classificata ha questa funzione
chiamato bind che essenzialmente mi permette
per fare le comprensioni monadiche con questo
generalmente significa prendere tutto di questi
diverse operazioni che si riferiscono
restituendo questi tipi a tutte queste monadi
di queste opzioni provate o queste sono
esempi di monade proprio così abbiamo appena
ho visto monadi senza dire monad e
combinare questi in operazioni così per
istanza qui ora posso iniziare a fare a
sequenza di operazioni che sono
indipendenti che non dipendono da ciascuno
altro e poi combinare questi e ottenere
risultati e hanno tutti gli errori
gestione effettuata per me dietro le quinte
nel modo molto più bello va bene così sia
opzione vincolante prova tutti questi sono alcuni
delle cose che sono disponibili a Aero
se sei interessato, dai un’occhiata
la biblioteca e inizia a giocare con quello
che ti dà delle belle cose fuori
la casella ora una cosa voglio anche
toccare brevemente prima di finire quale
è molto funzionale in termini di Kotlin
alcune altre cose che puoi fare con
funzioni in comune, quindi lasciami iniziare
con te tutti conoscono il
concetto di un dominio specifico DSL giusto
diritto di lingua che la spiegazione di
una lingua specifica per il dominio è una lingua
questo è specifico per un determinato dominio
lì vai così spero di averlo per esempio
una configurazione di classe che dice per
l’istanza ha una porta stringa una stringa a
stringa host e diciamo che ha una porta
informazioni di tipo port e quindi I’m
andando ad avere una porta di classe che ha per
istanza un valore e poi è lo è
sicuro booleano giusto quindi questi sono VAR
perché ho intenzione di impostare
ora nel chiamare ci sono molti modi per
inizializza bene quello che vuoi
non fare come Val
configurazione configurazione facciamo solo
imposta alcuni parametri di default qui così
lo faremo è che la porta è port e
allora qui diremo è falso scusa falso
e int è uguale a zero giusto per poterlo fare
fai la configurazione e poi qui fai
configurazione e quindi sai impostare il
mi dispiace configurazione di configurazione Val e poi
imposta l’host host e quindi imposta un valore
ecc. oppure potresti fare qualcosa del genere con
C e poi dentro C ora hai accesso
per ospitare e poi si ottiene l’accesso alla porta
quindi qui dentro faresti con il porto
e poi dentro qui diresti per
esempio sai che il valore è uguale a 90 ed è
sicuro è uguale a vero e quindi host potrei
metti ad esempio uno due sette zero zero
uno adesso questo è bello il problema
è che questo è un po ‘come un po’
un po ‘brutto perché ho finito con questo
qui a destra e quello che voglio fare è come
se per esempio si chiama config
quello che voglio fare è perché non riesco a liberarmi
di questo e solo fare una cosa del genere
giusto e un po ‘come creare il mio
configurazione DSL
proprio come JSON, proprio come niente
altrimenti come ho creato una configurazione
file per la configurazione delle porte ma
immagina che questo potrebbe essere un affare
logica o qualsiasi altra cosa come le informazioni fiscali
voglio essere in grado di avere questa capacità di
scrivere questo tipo di codice e avere
completamento e hanno controllo di tipo e
tutto questo per me posso farlo in
Kotlin beh, in realtà possiamo così ciò che è
questo è esattamente ciò che stiamo facendo
qui questo è essenzialmente un oggetto giusto
la configurazione in questo caso è un oggetto e
cosa sto cercando di fare se guardi il
schema sto mettendo alcuni lambdas quindi cosa
Sto provando a fare è invocare quell’oggetto
posso farlo a Colleen, posso farlo ?
avere una classe per esempio Q giusto e
allora posso venire qui e creare un nuovo
classe a proposito
questo non è vero in realtà
mio amico stava facendo un discorso dal vivo
giorno c’erano due di loro sul palco e
stava dicendo che sai che uno di loro lo è
come scrivere l’altro sta facendo
parlando lui dice ah hey lui è come
Richard crea una coda per me, quindi cosa
Richard fa lui crea una coda
chiamato foo code right e l’altro
è come dire che ora abbiamo questo
coda di influenza e lui dice che Richard creare un
seconda coda per me che cosa fa esso
crea un caso, YouTube, ecco perché
non si dovrebbe mai assegnare un nome al foo roba così
se ho questo foo posso ora invocarlo
come posso invocarlo vedi che ho appena colpito
alt entrare è così che lo invoco così che cosa
è questo che chiamiamo questo pazzo
in pratica quello che voglio fare è creare un
operatore in Kotlin che è chiamato
invoca appena posso quello che posso ora
invoca questo oggetto quindi se posso farlo
là facciamolo qui creiamo un
invocazione ora quando invoco non lo siamo
quale parametro dovrei passare?
qui vediamo quindi a cosa ho bisogno di accedere
Ho bisogno di accedere all’host e porto ciò che è nostro
ospite importa le loro proprietà di
configurazione in questo momento ciò che è un alto
la funzione di ordine in Kotlin è una lambda
giusto che prende un lambda ciò che è un
funzione di estensione è una funzione posso
passare le funzioni di estensione in ordine elevato
funziona al college sì, puoi farlo
è unico per chiamare il concetto è
chiamato lambda con i ricevitori così posso
passare in un lambda con ricevitore qui
che il tipo è in realtà un’estensione
funzione per la configurazione, quindi questo
è una funzione di estensione a
configurazione dato che è un
funzione di estensione per configurarlo
significa che ha accesso a
proprietà di configurazione che significa
che improvvisamente questo non è più letto e
Farò esattamente la stessa operazione qui
continua a dare la stessa cosa così farò
funzione di cosa ho bisogno di accedere a qui
porta destra quindi farò l’unità portuale e poi
vieni giù voilà ho il mio caro
così giusto così ho fatto DSL guidato
sviluppo ho iniziato con quello che ho
volevo e ho guidato dentro e fuori usando
alt-entra ora non ho nemmeno bisogno di sapere
Colin, ma il punto è qui ovviamente
Ho appena fatto un piccolo DSL che è
specifico per un’impostazione di configurazione ora
potresti non andare a questa estensione per farlo
qualcosa per la configurazione ma l’idea
ecco che puoi davvero abbracciare il
capacità di usare le funzioni del tribunale
e lambda con i ricevitori e il
possibilità di invocare oggetti e creare DSL
per le parti specifiche del tuo
domanda perché intendo se lo sei
facendo per esempio cose come dominio
design guidato proprio una delle chiavi
aspetti del design guidato dal dominio è
avere un linguaggio ubiquitario che è il
la stessa lingua che usi nel tuo codice
corrisponde a quello del dominio aziendale e
ora puoi iniziare a fare leva su di te
sapere come creare le sl non riguarda solo
creando HTML la nuova versione di quello
che non è necessario che si chiama
markdown ok
comunque questo è tutto il tempo che abbiamo per
ora non so se abbiamo tempo per
tutte le domande se non sono un po ‘in giro
po ‘più tardi comunque, quindi una domanda
quindi solo una breve domanda l’ultima parte
perché non è quello di default c’è un po ‘
inconvenienti di avere quella funzionalità
quale parte non è predefinita o dispone di un DSL
sul tuo sul tuo oggetto, perché dovresti
dobbiamo perché dobbiamo implementare
quei metodi vabbè intendo sì, intendo
prima di tutto non tutti lo faranno
voglio avere un DSL sul loro oggetto giusto
e questo è un sacco di codice aggiunto
che deve essere generato in
un po ‘di senso in secondo luogo
tecnicamente sarebbe solo possibile farlo
usando un po ‘ come un professionista
post-elaborazione come usare capped for
istanza una chiamata in-house giusta quale tu
può analizzare il tuo codice base e basato su
che genera qualche DSL ma di nuovo lo è
come se non pensassi che sarebbe qualcosa
che si desidera avere ogni singola classe
avere questa capacità di essere onesto con te
ok grazie grazie
[Applausi]
tu
tu
Please follow and like us: