
[Musica]
okay, ho intenzione di iniziare con alcuni
cose diverse ti mostrano alcune cose
intorno alla colonna che non si ottiene in un
corso introduttivo anche se Kotlin e
così non è un linguaggio così complesso
in realtà è facile essenzialmente
prendi ma tuffiamoci un po ‘
quindi la funzione di ordine superiore che sei
tutti familiari con così ho a
funzione che richiede un’eternità int
un altro numero intero e restituisce un intero
e questa è una funzione di ordine superiore giusta
quindi è una funzione che accetta una funzione
o una funzione che restituisce una funzione
e in Kotlin possiamo sapere di averlo
molteplici funzioni quindi posso avere per
istanza un GE qui che prende no
parametri e restituisce nulla di ricchezza
restituisce l’unità che è in realtà
diverso da niente giusto
è veramente unità non è niente unità è
un oggetto che è diverso da una classe
quindi quanti di voi sono JavaScript
gli sviluppatori qui è e non a
imbarazzo a mettere le mani così
oggetto è l’equivalente di oggetto in
JavaScript sai come sei passato
Java o C sharp to JavaScript e tu
come oh, prenderò tutto io
portato con me, così mi permetta di creare questo
sistema sorprendente in JavaScript chiamato
classi e gerarchie e di tutti
come no non farlo hai oggetti
nel chiamare abbiamo oggetti e abbiamo
l’oggetto classes è essenzialmente a
singleton questo è come si implementa a
singleton in Kotlin scrivi semplicemente
oggetto è che non devi comprare un
libro
che era un buon libro, a proposito
anche se ora al giorno d’oggi non si può dire
hai letto la Gang of Four che faranno
accigliato su di te sono come oh, non lo sei
facendo programmazione funzionale allora e così
Stavo dicendo che non è niente di giusto
perché niente è qualcosa in Collier
quanti di voi non hanno sentito nulla
okay quindi niente è qualcosa così è
fare qualcosa che non fa nulla e se io
ho unità e faccio eccezione questa
non fa nulla giusto, perché se lo scrivo
non fa niente , getta un’eccezione
ma se vengo alla mia funzione principale qui
e dico stampa nove ciao che lo faranno
lavoro se scrivo legge sulle eccezioni
non lo farò e se lo farò bene lo farò
eccezione e un cinque proprio dal
il compilatore dirà che questo non funziona
perché non lo raggiungerà mai
codice perché è stata generata un’eccezione
ma se scrivo qui, fai qualcosa che è
andando a non lavorare bene perché è
dell’eccezione tuttavia se rimuovo
questo e prendo questa linea qui e
Lo sposto verso il basso la linea di stampa è ancora in corso
supposto funzionare correttamente perché è
dicendo Beh, è che sta andando a lavorare è
chiamerò un metodo che arriverà
indietro e questa è la differenza tra
unità e niente perché niente
in realtà dice che questa funzione non lo è
andando a tornare lo farà
essenzialmente non essere nulla e ora lo è
dice che questo codice è irraggiungibile così
c’è una differenza tra unità e
niente e come dico sempre nulla
è nulla per voi di cui preoccuparsi in modo
andiamo avanti così abbiamo questo
qualcosa e abbiamo questo ordine superiore
funzione e una delle cose che noi
avere in Kotlin se hai familiarità con
ovviamente hai la corda
estensione hai la funzione
estensioni ma hai anche proprietà
estensioni giusto esempio molto buono di
questo è sempre come posso avere un lungo
che posso scrivere o un galleggiante che posso
scrivi usando letterale così posso scrivere dieci F
ciò significa che è un vero galleggiante e
noi
abbiamo lavorato con grandi decimali che noi
amato lavorare con voglio essere in grado di
scrivere grandi decimali questi dieci BD non posso
farlo, perché non esiste una letterale
per grandi decimali potrei fare il prossimo
la cosa migliore di ciò che crea un
proprietà di estensione, così bene che potrei
crea una funzione di estensione scrivilo
ma non sembra buono ma posso farlo
creare una proprietà di estensione così posso
crea un’estensione a numero intero per
istanza che restituisce un grande decimale e
allora questo tornerà un grande
decimale di questo diritto così che sta dando
me una proprietà di estensione va bene così uno di
i vantaggi di questo è che a parte
è molto bello da leggere
che puoi essenzialmente delegarli
la funzionalità di una proprietà a
qualcos’altro giusto per esterno
funzione che è possibile riutilizzare più e
più volte e questo è uno dei
benefici delle proprietà delegate giuste
quindi ho una lezione con un gruppo di
proprietà delegate e posso delegare
questi ad altre funzionalità e quindi
condividili su più classi e
è lì che abbiamo per esempio a
un sacco di delegati incorporati quindi tutti voi
probabilmente familiare con il delegato pigro
destra come molti di voi qui familiarità con
pigro così pigro è essenzialmente pigro
inizializzazione di una proprietà sta andando
per inizializzarlo al momento dell’accesso
la prima volta e sta andando
inizializza quel codice e non sta andando
per eseguire quel codice mai più e basta
fatto usando la dichiarazione della proprietà
pigro e poi usato da e poi pigro
che è il delegato integrato e quindi
Passo nella funzione effettiva che è
andando a inizializzare la nostra proprietà quindi se
andiamo oltre a pigri qui possiamo vedere
questo è un ordine superiore
funzione che richiede un inizializzatore
ha anche una versione sovraccaricata che
ti permettono di passare al diverso tipo
di inizializzazione che vuoi fare
sincronizzazione su proprietà condivise ma
questo è uno di quelli più comuni, ma
ci sono pochi altri quelli che sono anche
integrato nella libreria standard
uno di questi è il veto, quindi il veto
il muro è una proprietà delegata che
ti permette di dire se una certa condizione
è abbinato quindi aggiornare la proprietà
se no, non farlo bene senza di te
dovendo scrivere questa logica all’infinito
di nuovo così in questo caso lo sto dicendo
Ho la proprietà che ho un vecchio
valore ho un nuovo valore e dico
che se il nuovo valore inizia con una S
quindi aggiornare il valore se non è così
aggiorna il valore così qui dove siamo
creando per esempio un veto di classe e
allora io dico impostare il valore l’ho detto a
cambiamento che ho stampare il valore ho impostato a
strano, stampo il valore in
principio il valore dovrebbe cambiare solo
dopo che ho colpito strano, quindi se corriamo
questo lo puoi vedere alla prima chiamata
in realtà non sta impostando la proprietà
okay e sta impostando la proprietà
la seconda chiamata qui quando ho colpito
strano quindi questo veto palla pigro e
osservabili sono alcuni dei built-in
delegati che abbiamo nel
libreria standard che puoi usare ma
ovviamente puoi anche crearne uno tuo
delegazione di proprietà in comune e
essenzialmente quello che devi fare sei tu
devo creare una classe che definisce due
operatori uno di questi è chiamato get
valore l’altro è chiamato valore impostato
e molto come hai visto nel veto di tutti
esempio quello che sto ottenendo qui è un po ‘
informazioni sulla classe attuale quindi
Sto ricevendo informazioni su
proprietà K proprietà che cos’è la proprietà K
è proprio come proprietà ma prefissato
con una K che è qui e questo è un modo
spiegare Cortland
prendi tutto ciò che è Java e prefisso con
un K e quindi rilasciare le librerie con un K
intercalato con un C so che uno con
un K e questo è chiamato così K proprietà
è una proprietà Kotlin quindi è essenzialmente
riflessione migliorata a destra
quindi a Kotlin potresti essere consapevole di te
puoi usare la riflessione Java che puoi anche usare
Il riflesso di Kotlin è come Java
riflessione ma meglio ne ha un po ‘
cose aggiuntive che sono intrinseche
ingresso conoscenza intrinseca di Kotlin
come proprietà così questo è come te
puoi creare i tuoi delegati personalizzati e
quindi essenzialmente basta usarli
delegati ovunque tu voglia nel tuo
classi proprietà variabili di primo livello
ecc. va bene
quindi un’altra cosa che abbiamo dentro
collin è tipi di dati algebrici o noi
abbiamo rappresentato il nostro per rompere i dati
tipi con davanzale giusto quindi ecco a
semplice esempio di ciò che sarebbe un
algebrica tipo di dati che, se non siete
familiarità con questo concetto ora generico
tipo di dati di byte di dati è un tipo che può
essere un tipo o un altro, ad esempio
booleano booleano può essere di tipo true
scrivi falso così chiamandolo puoi farlo
essenzialmente fare la stessa cosa
dichiarando questo come un risultato aperto giusto
quindi qui ora quello che sto dicendo è mio
la classe può ereditare dal risultato e io ho
due casi questo è molto comune per
istanza se vuoi allontanarti
eccezioni o vuoi avere un
funzione che restituisce uno dei due
diversi tipi in caso di successo o
fallimento che si poteva fare qualcosa di simile
giusto e se lo fai questo è
assolutamente valido il problema con questo
è che se vengo qui, andiamo tutti
per esempio a un file e dico
classe a volte e talvolta eredita
dal risultato giusto che sta andando a lavorare
così giusto, perché risultato è un open
classe quindi se sto scrivendo codice che è
controllando che quel tipo di schifo
quello che puoi fare invece è contrassegnare la classe come
sigillato invece di aperto e sigillato
essenzialmente ciò che significa è che è
chiudendo la gerarchia va bene così ora
non puoi ereditare da quella classe
oltre a quello che hai tutto
ereditato e potresti chiederti cosa
è così bene qualunque cosa sia su quel file così
sigillato chiuderà la gerarchia a
quel file proprio qui a volte
non funziona più, ma qui a volte
funziona e questo non necessariamente
devi essere solo tu a seguire le tue lezioni
può anche averlo come fanno le classi annidate
hai una domanda o ti ho risposto?
oh sono troppo rumoroso è quello che è la mia famiglia
mi dice sempre che mi dispiace ci proverò e
parla un po ‘meglio è meglio
quindi sei seduto lì in questo modo
soffrendo di dolore, mi dispiace tanto
quindi ho II tinnito ora lo sai
come mi sento, tranne che non è la mia stessa voce
è comunque dannatamente squillante
quindi sono anche felice di sapere che il mio
le spiegazioni sono così fantastiche che tu
mi interessa solo il volume che è come
recentemente stavo dando che stavo dando un
webinar per un’ora un’ora a destra
webinar e ho avuto di tutte le persone uno di
i miei eroi Eric Meyer come moderatore
proprio così 50 minuti in cui nessuno lo chiede
domande e alla fine Eric dice come
abbiamo una domanda, io sono come sì?
è su Collin che è vero il ragazzo
Evan sono lì come si sta chiedendo qualcuno
cos’è quella freccia in IntelliJ IDEA
comunque quando sarò grande sarò un
programmatore numeri da 1 a 100 ora tutti voi
lo so a Collin se scrivo qualcosa
come questo e poi lo faccio per esempio
i numeri filtrano è inferiore a 10 o
diciamo che è divisore per 5 se potessi
digita e poi digli di prendere ciò che sta succedendo
accadere qui è ciò che questo è desideroso
valutazione giusta così essenzialmente è
andando a guardare l’intera lista
e poi filtrerà quelli
che sono divisibili per 5 anche se a
Alla fine della giornata tutto ciò che voglio è il
i primi 30 di loro
se vuoi avere una valutazione pigra
è possibile a Colleen tutto il necessario
fare è prendere qualsiasi iterable e chiamare come
sequenza su di esso non appena si chiama come
sequenza che ora diventa pigro valutata
proprio così essenzialmente lo stesso di Haskell
dove tutto è di default pigro
valutato quindi funziona con essenzialmente
tutto ciò che è iterabile se tu
effettivamente naviga verso una sequenza che puoi
vedi che è solo una funzione di estensione
su un Tribble quindi qualsiasi raccolta iterabile
tutto ciò che puoi sostanzialmente convertire in
sequenza e poi catena tutto il
metodi meravigliosi che hai quando
stai facendo il pipelining del metodo e allora
succede nei casi in cui non puoi
avere un intervallo per cominciare per quello
abbiamo altre funzioni come parte del
libreria standard e cioè generare
sequenza che ha due versioni una di
loro si siedono e poi su quel seme
puoi fare quello che vuoi e poi
da lì di nuovo filtro e tutto questo
di nuovo sarà pigramente valutato bene così
ci sono due modi per farlo come sequenza o
se non si dispone di una collezione per iniziare
con te puoi usare la sequenza di generazione
ok ora nella cosa precedente che hai visto
digita alias o sono ancora troppo forte oh
oh stai scansionando bene
giusto così nel precedente che avevi
digita alias un esempio di quando tu
voglio usare questo è ad esempio quello
che hai detto che sai che voglio avere un
gestore che è una funzione che va
da una stringa all’altra, ad esempio, a destra
se sapessi scrivere codice Kotlin e
o dimenticalo che non lo faccio
e questo è un uso che in realtà non lo faccio
come quello uso tanto perché uno dei
le cose che mi piacciono in giro per Kotlin sono le
scopribilità quando si guarda a
funzione sai esattamente cosa
i parametri sono così quando guardo a
funzione di ordine superiore e vedo int di
Intuit io esattamente cosa sta andando a
prendi non devo introspettare il tipo
per capire davvero cosa sta succedendo
prendere un altro caso utile di
digitare alias è per usarlo con
deprecato quindi quanti di voi proprio qui
api e spedisci quelle api alla tua
anche i clienti sono interni e tu lo faresti
amo rompere la tua api e poi tu
sai cosa puoi fare puoi effettivamente
vendere abbonamenti su di esso e poi quello
modo che puoi sempre aggiornare così per il
registrare JetBrains non vende API così
una cosa interessante che puoi fare
api è diciamo che ho una lezione
quindi andiamo avanti e in realtà rimuoviamo
tutte queste sciocchezze qui, quindi facciamolo
Dì che ho una classe chiamata cliente
giusto e poi ho una funzione principale
che sta usando questo cliente, quindi dico
bene cliente cliente eCos ora domani
Voglio venire e rinominare la mia arte
cliente al cliente fantastico adesso
se cambio il nome, questo romperà il mio
Api è così che quello che potrei fare è presentare un
nuovi valori TY che è fantastico
diritto del cliente che è essenzialmente a
cliente ok e quindi quello che potrei fare è
vieni alla mia classe cliente e aggiungi il
deprecato e dire che il cliente è ora
cliente fantastico giusto e vedere al più presto
come faccio quando aggiungo il deprecato
l’ ID sta per evidenziare questo e
dire che questo è un cliente fantastico ora
ma la cosa buona è che non l’ho fatto
Ho rotto la mia API in modo da poter fare un phased
aggiornamento giusto posso introdurre il tipo
Ali, noi abbiamo la gente che passa a quello
e poi alla fine nel secondo
versione rimuovere quel tipo di alias e in
Infatti, se sei stato a bordo con Kotlin
per molti molti anni ritorno quando noi
abbiamo usato per chiamare i tratti di interfaccia che voglio
per realizzare una t-shirt che dice
Stavo usando Collin quando era la nostra caratteristica
ha fatto questa migrazione graduale per Emory
ogni versione M facciamo questa fase
la migrazione prima ti avvisa e
quindi la prossima versione sarà a
errore del compilatore e puoi effettivamente utilizzare
l’IDE per risolvere questo per te in modo che tu possa
diciamo che si sostituisce al fantastico cliente
e quello con cui si sostituiscono è quello
ora ti dà la magicamente alt-enter
giusto così ora hai la sostituzione con
cliente fantastico, quindi è un altro uso
che potresti usare per digitare alias a
fare una migrazione di fronte va bene alcune cose
attorno ai funzionamenti in linea
giusto quindi andiamo a un ordine superiore qui
l’abbiamo visto giusto così in questo caso
cosa che abbiamo con la colonna è è
funzioni inline e infatti se si guarda
a molte delle funzionalità in
libreria standard puoi vederne molti
le cose sono in linea , puoi vedere
che molte di queste funzioni sono dentro
linea e la ragione di questo bene se
sei chi è familiare qui con inlining
giusto così per coloro che non hanno familiarità con l’ inlining
essenzialmente cosa significa che è
copia / incolla destra così invece di me
chiamare quando invochi una funzione quando
tu chiami operazione invece che in realtà
invocando e avendo tutta la chiamata
stack associato a ciò che è
andando a fare è andare a copiare che
funzione e incollalo esattamente dove
lo stai invocando, va bene così
senso per farlo con funzioni che sono
piccolo sai che non lo fai con
funzioni che conosci 200 righe di
codice
ora, naturalmente, se hai funzioni simili
sono 200 righe di codice il tuo problema è
perché hai funzioni che sono due
centinaio di righe di codice non inlining
ora con Kotlin lo fa davvero
senso di fare inline quando le tue funzioni
sono funzioni di ordine superiore non solo
funzioni generali, ad esempio se io
dovevamo creare una funzione qui chiamata
divertimento amico mio e questa funzione ha un
intero e poi aggiungo un inline
ad esso qui puoi vedere che il
compilatore sta per darmi un avvertimento
e sta andando a dire che il mio amico a
la linea è insignificante la prestazione
guadagnato nel rivestimento di questa funzione è
insignificante nella fodera funziona meglio per
funziona con lambda come parametri
va bene in questo caso non lo dice
perché in realtà ho un lambda come a
parametro quindi cosa significa questo
quando creo questa funzione inline è
non solo andando in linea la chiamata vera e propria
a questa funzione ma lo farà
in linea anche il parametro
a destra è lì che si ottiene alcuni dei
vantaggi ora ci danno le funzioni inline
un altro vantaggio che vedremo
in un momento ma ci sono momenti per
qualunque sia la ragione, ad esempio tu
vogliono essere in grado di tenere un riferimento alla
un fattore in linea per un ordine elevato in a
funzione che viene passata in questo
parametro che non si può fare con
funziona in linea ciò che è
passato nei lambda tutto quello che puoi fare è
essenzialmente li invociamo così ci sono
volte in cui si desidera che determinate funzioni
non essere in linea che in questo caso puoi
decorarlo con un no in linea quindi se io
avere per esempio un altro ordine superiore
funzione qui posso decorare il secondo
uno senza diritto in linea così ora è
dicendo che mentre l’inlining è applicabile
in questo caso perché ho un lambda
che è in linea
per alcuni casi non voglio che sia
in linea va bene c’è un altro fatto che c’è
un altro che si chiama croce in linea
che non ho intenzione di darti
spiegazione di perché per quello sei
andando ottenere un cioccolato in modo da andare in movimento e
google it
quindi anche l’ inlining ci dà certezze
benefici giusti e cambia anche
un po ‘un comportamento e questo è dove noi
vieni a ritorni così qui ho un
funzione che viene chiamata contenente
funzione e in pratica scorre attraverso
un elenco di numeri e poi sta andando a
fare un ritorno se dovessi eseguire questo cosa
pensi che l’output di quello sarebbe
niente niente non restituisce nulla
è un’unità di ritorno che sto scherzando
chi dice nulla che dice ciao chi dice
sono io no, non capisco
Adele oh mi dispiace che non sia andata male, si
hai sentito peggio ora oh si e tu
Ho chiamato Adele, va bene, sì
deve aver succhiato bene, sono così se corro
questo non restituisce non stampa
uh non viene eseguito cosa ho fatto
Oh G parametro G dov’è il mio G op no solo
rimuovi quello che succede quando io
fai la programmazione in tempo reale, quindi torna ai ritorni
se eseguo questo, tornerà
niente è giusto ciò che mi dispiace
non stampa nulla
ora prima capiamo perché dare un’occhiata
in questo esempio questo è il mio inline
funzione c’è un intervallo del mio per
ognuno e questo è esattamente lo stesso di
ognuno di fatti se si naviga per ciascuno
da qui a destra dividiamoci verticalmente
e allora io tornare a voi i rendimenti
posso vedere che il mio per ciascuno è essenzialmente
lo stesso come per ogni qui che ora
è morto per me
ma comunque è esattamente la stessa fiducia
me se io se corro contenente la funzione
con il mio per ciascuno cosa pensi che sia
andando a stampare ciao
o non stamperà nulla di buono se lo è
esattamente uguale all’altro per ciascuno
non stamperà nulla di giusto
era una domanda trabocchetto
comunque non stamperà nulla
nota una cosa che non avrei corso
questo se rimuovo l’ inline non posso
ritorno a destra e questo è ciò che viene chiamato
restituisce non locali il fatto che questo sia
tornando fuori
il fatto che non stia stampando ciao è
perché il ritorno sta tornando da
contenente la funzione perché sta tornando
dalla funzione di contenimento perché per
ognuno è una funzione in linea quindi esso
significa che è essenzialmente copiando incollando
il codice in linea e quando chiamo ritorno
c’è solo una funzione con cui tornare
che è la funzione di contenimento, quindi cosa?
succede in questo caso bene in questo caso
non puoi effettivamente fare un ritorno non locale
perché le funzioni sono solo i rendimenti
applicabile direttamente quando invocato come
questo sono applicabili solo in linea
ora funziona cosa succede se voglio
effettivamente tornare al contenitore
funzione e non all’invocazione di
la funzione di contenimento utilizzo un’etichetta n
questo non è un tentativo di piacere , non lo è
ok questo non è un andare a è un andare più bello
è un atto quindi uso Ad e AD è il
nome effettivo della funzione non sono questi
costruito in etichette proprio se io se il mio
la funzione è stata chiamata il mio foreach allora
sarebbe al mio foraggio e in effetti tu
posso anche prefissarlo con un’etichetta
posso dare quell’etichetta lambda così posso dire
la mia etichetta e poi tornare alla mia etichetta ora
se non sei a conoscenza in Collin che abbiamo
agnello bene, sai che li abbiamo visti
giusto questo è un lambda intendo dove come
il mio ordine superiore se scrivo principale è questo
un lambda quindi se scrivo F in ordine superiore
e poi da X a X più qualcosa che è un
lambda giusto
questo è un lambda che in molte lingue
è chiamata la stessa funzione anonima in
coordinate non abbiamo anonimo
funziona pure questo è un anonimo
funziona bene è letteralmente lo stesso
come in JavaScript, quindi ho una funzione
senza nome dove posso passare nel
nome del parametro effettivo e quindi fare a
ritorno nel caso di un anonimo
funzione esegue un ritorno locale
al contrario di un lambda che significa così
se vuoi i ritorni locali puoi farlo entrambi
utilizzare etichette o funzioni anonime ok
si, cosa intendi?
ma non è per quello che ho appena mostrato
tu puoi usare per le funzioni anonime
questa è una domanda che è meglio chiedere
da Andre immagino che non ci sia
ci sono molte ragioni per cui ne facciamo un po ‘
cose a Kotlin per alcune di loro
motivi di prestazioni per gli altri
attrezzo da tenere in considerazione anche se molto
di volte in cui la gente ci dice perché
dovrei usare Carlin se Scala è giusto
come Kotlin ma mi permette di saperne di più
più cose perché la flessibilità e
la versatilità che Scala ha anche
rende estremamente potere dell’arte di fare
strumenti e prestazioni saggi non è così
performante giusto quindi ci sono
potrebbero essere alcune ragioni a volte che noi
fallo per la prestazione altre volte
potrebbe significare che stiamo facendo qualcosa perché
stiamo andando ad aggiungere in seguito un’altra caratteristica
che consentono di essere in grado di distinguere
stiamo usando questo in anticipo giusto
ok ora con l’inline che ho detto
l’inlining va bene per motivi di prestazioni
l’ altro è per la reificazione
dei generici va bene così se sei familiare
con la JVM che probabilmente sei tu
sappi che abbiamo questo piccolo piccolo
problema chiamato tipo cancellazione proprio così
quello che puoi fare con Kotlin è qualsiasi
funzione inline è possibile aggiungere il refight
parola chiave ad esso e che poi consentirà
di fare certo tipo di controllo sulla
tipo generico giusto quindi in questo caso posso
dire è l’input di T se rimuovo reificato
mi dice che non posso farlo bene così
reificazione e se rimuovo in refight
vedi che ricevo di nuovo l’avviso
giusto dice la performance
il miglioramento qui è minimo perché tu
non ho una lambda, ma non è così
appare quando sto usando il refight
perché mi permette di prenderne un po ‘
informazione a volte va bene un’altra
La cosa che abbiamo in Cortland è bene
avere questo in molte lingue, ma lo è
varianza covarianza e controvarianza
quindi ecco alcuni codice questo è un mutabile
elenco di qualsiasi
e questa immutabile lista di stringhe e se
Io disapprovo che questo funzionerà sì
o no ti darò un suggerimento
il motivo per cui è commentato è perché
Controllo sempre che questo progetto
compila prima di fare le demo così è
non andando a lavorare perché non lo farà
lavoro così ho una cosa che sai una stringa è una
sottotipo di qualsiasi variante tranne che sta scrivendo
varianti ma perché non funziona spiegare
a me perché questo non funzionerà correttamente e
questo è quello che sta dicendo, ma si
no, non sto dicendo come aggiustarlo
dicendo perché non funziona bene si
si e immagini immagina molto più facile
esempio per voi per vedere questo sarebbe
essere molto ovvio come se stai passando un
elenco mutabile a una funzione e tu passi
se una funzione di tipo any nel tuo
stringa di tipo passiva la funzione è di
tipo qualsiasi così essenzialmente dentro
funzione è possibile aggiungere qualcosa a questo
elenco giusto perché è spento tipo any e
eppure se passi in una serie di
stringa non è possibile aggiungere un numero a un an
array di stringhe, no, ho appena detto
loro la risposta per cui ne ho di migliori
cioccolata grazie, lo farò , è così
è cioccolato fondente o è latte I
non lo voglio
quindi ora funziona, perché funziona?
perché è immutabile vero e proprio
impostazione predefinita nelle raccolte di elenchi di Kotlin
sono tutti immutabili al contrario di
mutabile è per questo che devi scrivere
bello ok ora in colonna non lo facciamo
abbiamo chiamate varianti del sito ma cosa?
puoi fare è puoi dichiarare certo
tipi come questo elenco qui è questa lista
se vai alla dichiarazione puoi vedere
che questa lista è giusto controvariante
che sta indicando ciò che abbiamo appena
fatto è possibile e in Kotlin questo è
espresso senza ok così hai fuori
e tu hai così abbiamo una dichiarazione
varianza del sito che significa che noi
dichiarare la covarianza o il
contravarianza di quel tipo al
dichiarazione sito hai anche tu sito
varianza quando si sta interrompendo con
java per esempio o in uno specifico
funzione puoi chiamarti varianza del sito
ma generalmente in Kotlin lo fai
variazione del sito di dichiarazione che significa
E ‘grande perché non devo avere
questo punto interrogativo si estende a tutto questo
che facciamo costantemente in Java la regola
di pollice qui è davvero semplice è se
la tua classe sta consumando solo allora
covarianza e in effetti l’IDE può dire
tu dici che stai solo consumando
qui in modo da poter aggiungere il in per fare questo
covarianza se stai producendo, allora è
sta per essere controvariante e si sarebbe
aggiungi l’out okay per riassumerti
avere covarianza e contravarianza
può dichiararlo al sito di decorazione
e puoi anche usarlo in modo specifico
casi su siti di chiamata ora cerchiamo di entrare in
alcune delle altre cose intorno alla colonna
che è dsls okay, facciamo un po ‘
codifica qui, quindi, quanti sono familiari?
con DSL quindi linguaggi specifici del dominio
dsls sono fantastici, ddd me Scott, non lo so
sai perché Ross Scott va a posto e basta
come chiamiamo le cose che vengo dalla Spagna I
non intendevo quello come un insulto
no e una volta stavo per andare
per venire sono andato in una compagnia prima di me
sono entrato in Jabbar e stavo facendo consulenza e
Sono andato a due ti dico questa storia
perché questo è veramente vero io
sono andato a una società di consulenza e lo ero
facendo la revisione del codice e hanno avuto un
funzione che è stata chiamata così chiunque
parla spagnolo qui va tutto bene
Lo spagnolo quindi è stato chiamato per prendere un Manolo
scrivere e andare a prendere il suo Manolo un mezzo
data e Manolo è Manuel un nome e io
disse quello che è una Manola e lui disse
è una funzione che abbiamo scritto per Manolo
perché Manolo voleva la data in questo
formato specifico e ho detto ma c’è
ci sono due Manolo qui e hanno detto
no, è un manuale che è l’abbreviazione di Manolo
Manuel e questo Manolo l’ ho detto
cosa succede se vuoi una variazione lui
dice bene lo chiameremo solo mio
Conoscenza che scrive e non scherzo
questo è il codice che è là fuori comunque
quindi tutti voi conoscete la funzione
le estensioni nelle chiamate così posso scrivere è
stesso come valore stringa e quindi lo faccio per
esempio questo equivale a valore giusto e se
ancora una volta ero solito sapere come scrivere
Codice Kotlin ci vai così questo è un
funzione di estensione quindi posso dire ora o
questo è lo stesso di questo diritto e posso farlo
Questo
anche nella notazione infix che posso
basta scrivere così e sbarazzarsi di
quello e la parte migliore del fare
le demo in Kotlin in IntelliJ sono perché io
non ho nemmeno bisogno di sapere Kotlin, solo
colpisci alt enter e posso farlo entrare
correggi e ora è fantastico perché adesso
Posso chiamare una notazione infissa e questo
inizia a dire oh questo sembra carino
Sembra genere della DSL, come giusto o
il nostro BDD bene quindi questo è il questo è il
cosa tipica che vedi in Kotlin
in questo momento DSL è un po ‘ più lontano
con il cotone e quello che non potremmo fare è
proviamo e creiamo per esempio un DSL
questo mi permette di fare qualcosa di creativo
quadro sugli sviluppi del web come
molti di voi hanno familiarità con Express
Jas o Ruby o Sinatra e cose simili
giusto quindi voglio fondamentalmente creare
una funzione che ha per esempio un get
che prende un percorso di tipo stringa e
poi prende un gestore giusto e il
gestore sta andando a prendere per esempio un
richiesta che è una richiesta HTTP e a
risposta e restituirà unità
e poi avrò una lezione
richiesta che per esempio prende la proprietà
di tipo accetta e ho intenzione di avere un
risposta di classe che prende per esempio
codice di stato della proprietà di tipo finisce e di
il nostro contenuto di tipo stringa proprio così ora
Potrei fare qualcosa tipo tornare a casa
ora sono a Cortland, ricorda se il
ultimo parametro a un altro a una funzione
è un’altra funzione in cosa puoi fare
Kotlin invece di racchiuderlo
qui puoi racchiuderlo al di fuori del
parentesi destra così potrei allegare questo
qui va bene okay
e andiamo a dare il nome a questo
come root, per esempio, okay, perché?
dandomi un errore il quale richiedente oh
si, va bene così sì , ora devo fare
richiesta di risposta e quindi devo fare
per esempio se le richieste accettano echos
applicazione JSON proprio allora qualunque cosa
come ad esempio il contenuto della risposta è uguale
qualche JSON giusto e adoro la chiave di fuga
dal modo in cui sai come scrivere JSON in
IntelliJ right alt enter iniettare JSON e
poi fai alt enter edit JSON framment
e poi lo fai come se non lo facessi
siediti e fuggi dai personaggi
va bene così ora questo è bello il problema è
che ho tutta questa orribile richiesta
risposta e le parentesi graffe e tutti
quella merda e questo sembra un po ‘ schifoso
ora quello che posso fare è che posso rimpiazzarlo
con il gestore, ad esempio, destra crea a
tipo chiamato gestore di quell’handler a sua volta
accetta un oggetto di richiesta e una risposta
oggetto giusto e quindi quello che posso fare è
dato che a Kotlin potrei potenzialmente se
c’è un singolo parametro per una funzione
sostituirlo con quello di cui potrei liberarmi
la dichiarazione esplicita qui e poi
questo lo prefissa con giusto e
allora la richiesta diventerebbe richiesta e
la risposta sarebbe diventata una risposta okay
ora sembra bello ma di nuovo è così
esso
è quel miserabile che voglio ottenere
liberarsi di così
come posso fare questo voglio fare proprio come
se richiesta, come posso farlo così tu sei
tutti familiari con le funzioni di alto ordine
le giuste funzioni di ordine superiore sono ciò che
funzioni che prendono altre funzioni o
funzioni di ritorno cos’altro abbiamo in
chiamato oltre alle funzioni che abbiamo
funzioni di estensione quindi perché non combinare
i due perché non creare un ordine superiore
funzione che non prende solo un
funzione ma richiede una funzione di estensione
quindi quello che potrei fare è invece di questo
assumendo una funzione posso dire che voglio
ottenere la root per prendere una funzione di estensione
e il modo in cui lo fai è prefisso
con un punto simile a come dichiari
una funzione di estensione quindi ora sto dicendo
quella radice diventa root richiede un’estensione
funzione ora dato che questo è un
funzione di estensione qui significa questo
che questo lambda è quello che è un membro
di gestore dal momento che è un mammifero di
gestore che cosa ha accesso ad esso
ha accesso alle proprietà di quel Handler
il che significa che posso sbarazzarsi di esso
okay e ho il mio bel po ‘
sintassi più bella qui mi sta seguendo bene
ora questo è anche bello ma voglio andare
un passo avanti e se volessi fare
qualcosa del genere e se volessi fare
qualcosa del genere
giusto contenuto ora seguiamo lo stesso
modellare il problema qui è quello
la risposta ora è di che tipo e
essenzialmente quello che sto facendo qui è io
voglio fare quello che voglio invocare un tipo
giusto perché questo è un lambda
quindi sto dicendo come posso invocare un tipo
non è possibile in realtà è in
chiamarti puoi creare una classe foo e
allora puoi dire che voglio creare un nuovo
istanza di foo right e then in foo I
posso dire ciao e poi questo dirà
ondulata e dirò di no e cosa farò
fare è creerò un operatore che è
chiamato invocare in modo che ora mi permette di
invocare un’istanza dato che posso
invocate bene un’istanza perché no
Faccio solo la stessa cosa qui perché no
Invoco un caso come faccio a farlo
bene, qual è la risposta è un tipo
così
Devo fare è creare un operatore
invocate per il tipo di classe e io lo farò
dì a IntelliJ di farlo per me ora arriva
la domanda su cosa passerò nella sua
parametro bene di cosa ho bisogno qui io
bisogno di contenuti ciò che è contenuto è un
proprietà di risposta
quindi creo questo come un’estensione
proprietà al significato di risposta che ora ho
il mio contenuto va bene ed è così che tu
crea le loro cellule in Collin ora
questo è solo un esempio di DSL e il
la bellezza qui è esattamente ciò che abbiamo visto
è questo quando parliamo di persone DSL
rapidamente single come non ho intenzione di
crea il mio HTML no, non lo sei
la bellezza di DSL è la piccola DSL che
si crea attraverso la vostra giusta applicazione
se combini questo qualcosa con
Il laboratorio di Alberto intorno al
progettazione basata sul dominio ciò che è uno dei
idee dietro il design orientato al dominio mi dispiace
questo è un altro workshop sul dominio
durante il design l’idea è di avere questo
concetto del linguaggio ubiquitario giusto
se sia dove il business
allinea con il modo in cui scrivi il codice pensa il
potenziale che potresti avere qui proprio tu
potrebbe avere l’ ufficio delle imposte olandese definire
le loro regole in cotone sono come la mente
soffiato in realtà ero alla tassa olandese
ufficio e ho detto loro così
e hanno detto che inizieranno
guardando Cartland così ci sei tu
l’affare era se mi trasferisco ad Amsterdam ottengo
come una riduzione fiscale di massa
non essere fico, lo faccio comunque
sì comunque è un po ‘come il
roba di dsl a Cortland, giusto e questo è
dove puoi usare questa macchina e puoi
usa questa roba per creare meravigliosi
little dsls per il tuo dominio
design per il tuo file di configurazione per
tutte queste cose le abbiamo usate
in modo estensivo, ad esempio in team city
qual è la nostra continua integrazione
server ora abbiamo creato lo strumento dsl come
ti consente di definire tutti i tuoi
configurazione con cotone di destra Gradle
lo ha adottato per lo stesso scopo
okay tutte le domande si in che senso
sarebbe la prestazione
Non credo che sia apprezzato ho
non pensare che sia come sarebbe
in questo caso minimo, so che non vedo
un problema in termini di prestazioni va bene
rapidamente mi resta qualche minuto
giusto così ti faccio vedere un po ‘di fretta
le cose intorno a che cosa è questa cosa che
vedremo il karate
sì karate, ok, quanti di voi hanno
guardò in co-routines e Colleen
le routine di Cole sono fantastiche
il modo migliore per fare le cose
Sto scherzando um così bene che non ho
internet quindi non posso mettere il mio meraviglioso
scorre su ma quanti di voi facendo un
programmazione sincrona adesso come
molti di voi fanno discussioni mi piace
Callback JavaScript piace moltissimo Va
Parte JavaScript della parte callbacks
proprio così i fili sono complicati tutti noi
sapere che tira indietro succhia perché il
problema con callback è che hai un
funzione che lo chiama una volta
completarlo richiamerà un altro
funziona il problema, naturalmente , tutti noi
so che non è solo una funzione
quella funzione dovrà quindi chiamare
un’altra funzione come callback e quindi
un’altra funzione come richiamata e così via
e così via e benvenuto al
meraviglioso mondo di JavaScript che
sembra un albero di Natale inclinato a destra
perché quando metti tutto il piccolo
conosci frecce come questa sembra
un albero di Natale se lo guardi
orizzontalmente a destra e poi ovviamente
lesioni nel mondo di JavaScript fanno il
normalmente con la gestione degli errori di callback
è anche problematico, quindi di solito il
primo parametro in JavaScript di
la convenzione era per errore
ovviamente alcune persone pensano che sia un evento
o per eccitare così non lo fanno nemmeno
gestire gli errori così in Coleen che abbiamo provato
adottare un approccio a un sincronismo
programmazione e programmazione concorrente
usando questo concetto generico che all’interno
intorno dagli anni ’70 o se non prima di me
pensa agli anni ’50 chiamati co-routines
destra o sospendere i calcoli a base di erbe
sotto le coperte le co-routines sono
essenzialmente la stessa identica cosa di
richiamate tranne che non sei preoccupato
su come fare i callback
è il compilatore che è
i callback hanno il diritto di compilare il compilatore sotto
le copertine stanno creando la macchina a stati
assicurandosi dove il compat dove quando
quando sei di fronte a sospeso
la funzione è chiamata può essenzialmente
riprendere ad un certo punto in cui può riprendere
tutto questo è curato per te
sotto le coperte dal compilatore e il
modo in cui lo abbiamo fatto in cotone è
essenzialmente aggiungendo una sola parola chiave
della lingua chiamato sospendere il diritto e
il vedere che la sospensione è questa
la funzione è finita qui è questa parola chiave
qui sospendere e cosa significa sospendere
che questa funzione può essere essenzialmente
sospeso in un certo punto del tempo e poi
a un certo punto ripreso bene, quindi pensa
su una funzione che puoi mettere in pausa e
riprendere a destra Cortine prendere questa idea di
avendo sospeso i calcoli a base di erbe dove
Posso chiamare una funzione sospenderlo
continua qualcos’altro riprendi quello
funzione recuperare le informazioni e così via
e così via e facendo questo a
livello del compilatore che significa che non lo fai
bisogno di primitivi che significa che se tu
stanno prendendo di mira JavaScript con Kotlin
targeting della JVM con la chiamata no
doversi preoccupare di avere una piattaforma
inserisce una piattaforma che non ha thread
tutto questo si sta prendendo cura di te sotto
le copertine del compilatore per capire
come lo fa con
fili leggeri e quando dico
fili leggeri voglio dire così ecco qui
un esempio in cui ne ho uno da cento
mille posti di lavoro che sono essenzialmente
discussioni che sto lanciando e che sto per fare
fare un sonno filo e poi ho intenzione di
stampare un punto quando il thread dorme
e ho intenzione di eseguire questo va bene così io sono
gestirò le discussioni okay, vado a correre
questo cosa pensi che i risultati vadano
essere fuori di memoria si
e guarda la mia fantastica cosa nyan cat
memoria insufficiente per creare nuovi
filo
okay, farò lo stesso con
co-routines e kolaches puoi
essenzialmente vedere che è esattamente il
stessa cosa tranne invece di uno due
lavori un dente sotto giuramento che ho creato
una lista ho questa piccola cosa qui
chiamato lancio che non è necessario
mi preoccupo per ora ho
questa cosa si chiama ritardo che è
essenzialmente come thread sleep e
Ho stampato se corro questo che fai
penso che succederà è ovvio, vero
perché se fallisse ci sarà un
demo davvero merdosa quindi questo è in realtà
andando a correre e finirà ed è
stampato centomila fili
giusto e infatti posso stampare a
milioni di thread giusti e mi consente di
riprendi fiato e cosa sta facendo
è davvero un filo leggero proprio così
sta sospendendo le funzioni facendo il lavoro
sospendendo il lavoro sospendendo
riprendere indietro e che sta facendo questo
usando cercando di farlo in un modo che è
familiarità con il modo in cui si codifica già
quindi l’ idea principale dietro le co-routine è
che continuo a lavorare nel modo in cui ho
di solito ha funzionato bene senza doverlo fare
conoscere nuovi operatori con no
dover conoscere nuovi modi di
scrivere un codice sincrono ne ha uno
hai giocato con Java rx proprio così Rx Java
la prima volta ti presentano rx
Java ti dicono che tutto è a
stream ed è osservabile e gentile
di pensare a cosa diavolo hai appena detto?
per me
giusto e l’ idea è che ti allontani
da un valore discreto o te ne vai
da te sai nello specifico set di
valori a un flusso di valori che tu
continuamente può iscriversi all’utilizzo
ciò che è essenzialmente un modello osservabile
Rx è praticamente un osservabile
modello con una serie di operatori su
in alto e se hai fatto rx sai
che è necessario disporre di un cambiamento di mentalità per
allontanarsi da un certo modo di
programmazione in un modo diverso di
programmare con le co-routines l’idea è
che non lo fai con le co-routine
l’idea è che tu continui a programmare
nello stesso modo in cui verrebbe effettivamente preso
uno sguardo a questo codice è proprio questo codice
chiamando due funzioni e misurando
millimetri è una libreria standard
funzione che misura solo per quanto tempo
codice che il codice sta per prendere e quindi
Ho intenzione di chiamare la funzione di una funzione
due e stampare il risultato di uno più
due questa funzione ha una sospensione è
ha chiamato questa cosa magica chiamata sospendere
il che significa che è una funzione sospesa
e questo ha una sospensione
anche se corro questo per quanto tempo
pensa che ci vorrà un secondo
facciamolo, non prenderà né l’uno né l’altro
uno o due ne prenderanno duemila
quindici millisecondi che è leggermente
più di due secondi quindi sì, ci vorrà
due secondi il punto è che questo
è esattamente quello che ci si aspetta
Sto facendo funzionare una funzione e quindi sono
eseguire un’altra funzione
l’idea dietro le co-routine è che io
continuare a lavorare come sono allora
stai dicendo che cos’è il maledetto
punto degli altri perché questo non lo è
in esecuzione sul thread principale è
potenzialmente non bloccare il thread principale
più perché c’è questa cosa qui
chiamato blocco ROM che sta per
bloccare ma dimenticare il nome che sta per
bloccare il thread principale fino a qualsiasi core
di routine non uso così mi permetta di ottenere a quella
quindi questa è una funzione sospesa, giusto io
non può solo venire e avere una funzione principale
ecco se prendo una funzione principale
qui e dico la funzione uno non lo è
intenzione di lasciarmi chiamare perché questo
dice che questo sta sospendendo la funzione in modo che il
funzione che chiama questo deve essere
in grado di sapere come gestire le sospensioni
sospendendo le funzioni in modo da poter solo
chiamare sospendere le funzioni da altri
sospendendo funzioni la voce principale
punta a un’applicazione che potresti usare
qualcosa come il blocco della ROM o alcuni
altro meccanismo che vedrai ma
Il blocco della ROM è un po ‘come un aiuto
metodo che ti permette di invocare
sospendere funziona il fatto che questo
sta facendo questo significa che non è più
bloccando il thread principale che avevi a
domanda
thread thought join è essenzialmente
aspettando i fili proprio qui lì
non è una minaccia o partecipare alla minaccia o partecipare
in che senso è diverso come in
thread che mi unirò a te stanno lanciando 30
fili giusti e poi stai aspettando
per loro di aderire okay ma devi
aggiungere un po ‘ad un certo punto per aspettare il
discussioni per aderire e stai lanciando
discussioni va bene in questo caso al
pratico come il in termini di
risultato non è non c’è differenza
la differenza è che non ci sono
i fili qui vanno bene questi sono leggeri
discussioni Otis
ok, ma il punto è che questo è
dall’alto non è magico perché uno di
le cose che preferiamo in Kotlin è
che quando vuoi la concorrenza ti serve
per essere esplicito giusto e questo non lo è
concurrent questo è sequenziale quindi come
lo faccio in concomitanza in questo modo simultaneamente
ho una sintassi chiamata sink e sink
non è una parola chiave del linguaggio un lavandino
è essenzialmente una libreria chiamata parte di
la biblioteca di co-routines di Kotlin e io
pensa cosa sta facendo ora in questo caso
sta dicendo che sì questa funzione è
ora un freddo sincrono così in questo caso
lo eseguirà contemporaneamente
il che significa che il tempo sarà uno
seconda destra se hai familiarità con
c-sharp questo sarebbe simile al
una sincronizzazione attende in c-sharp la differenza
è che qui in realtà posso ottenere il
valore invece di ottenere un compito e
quindi ispezionando il valore di quel compito
e puoi fare delle cose interessanti con
routine di codice come ad esempio anche
avere chiamate sincrone che sono pigramente
valutato quindi per esempio qui sono
definire una funzione una funzione
due e poi dico risultato un’attesa e
risultato aspettare come prima
la differenza è che sto passando a
parametro chiamato pigro cosa fa
significa che ciò significa solo
inizia questo co-routine quando è
necessario che significa quando viene chiamata un’attesa
il che significa che in questo caso ciò funzionerebbe
due secondi giusto perché fino a un peso
non è chiamato qui , in realtà non lo è
devi chiamarlo okay così sai
co-routines si il pool comune
quindi le co-routines usano questo leggero
discussioni per così dire e il possibile
lanciare questi in diversi contesti
contesto in modo che il pool comune sia uguale a a
comune stagno di filo per così dire
potresti lanciarlo dentro e poi
ci sono diversi parametri che puoi
ad esempio, non confinato
nel senso che io so che non è così
importa dove lo lanci tu puoi
lanciarlo in un posto e riprenderlo in
un altro
questo essenzialmente lo sta restringendo a a
pool comune specifico che potresti anche
crea il tuo contesto threaded e
associarlo a quel thread
contesto il punto che sta qui è che può
Vado due minuti fuori bordo grazie
il fatto di essere qui è che dovrei
ho fatto questo quando ho iniziato il lancio
Studio Android in realtà ora dovrei
ho lanciato l’emulatore prima ancora di me
volò fuori da Malaga il punto qui
essere è quello che stai lanciando a
routine khole quando passi in comune
pool posso effettivamente passare in altre cose
hai familiarità con il nostro ex Java così
iscriversi su pubblica su una specie di simile
e posso effettivamente lanciare sull’interfaccia utente
filo anche a destra
quindi ecco un esempio questo è come questo
è per me per Android come non lo faccio io
non sapere nient’altro che come lanciare
questa app in Android ok e questo è il
solo ora ho mai aperto Android Studio
quindi questo è Android questo è un
applicazione che essenzialmente è
lancio di Fibonacci sul thread principale
per così dire giusto e sta calcolando
Sequenze di Fibonacci sul filo principale
e ogni volta che clicco questo è
calcolare una sequenza di Fibonacci a destra
e vedi che l’interfaccia utente sta aggiornando e
quando continuo a fare clic su questo continua
aggiornamento e sta aggiornando questo sul
thread principale quindi non ho nemmeno bisogno di
preoccupati perché sta prendendo
cura di assicurarsi che questo stia arrivando
di nuovo sul thread principale, quindi questo è il
parametro di contesto che si sta passando
si simile si okay sì sì Cora teens
sono una libreria separata che vengono spedite
questo è chiamare le co-routine quando ci provi
per favore provateli ora per favore usateli
quando li provi per la prima volta, l’ID sta andando
lamentarsi e dire che questo è un
funzionalità sperimentale puoi vederlo
dice la correzione sperimentale che se ho appena detto
ci vai tu basta aggiungere questo e poi
non più sperimentale è tutto
meraviglioso
la ragione per cui l’abbiamo fatto
era sperimentale
perché il marketing non era coinvolto nel suo
una parola completamente sbagliato siamo è
siamo completamente seminati
usando un’introduzione, infatti, c’è un
nuovo framework da cui abbiamo creato
il terreno per chiamare il framework web
chiamato Couture che sta usando
co-routines da zero siamo
usando un codice di produzione lo faremo
mantenerlo quindi non ti preoccupare di questo
la bandiera sperimentale lo ignora semplicemente
non lì non fa parte dello standard
libreria come parte della libreria chiamata
co-routines Kotlin X chiamato Linux o
co-routine
l’unica cosa che abbiamo aggiunto al reale
il linguaggio stesso era la parola chiave chiamata
sospendere okay
[Applausi]
okay, ho intenzione di iniziare con alcuni
cose diverse ti mostrano alcune cose
intorno alla colonna che non si ottiene in un
corso introduttivo anche se Kotlin e
così non è un linguaggio così complesso
in realtà è facile essenzialmente
prendi ma tuffiamoci un po ‘
quindi la funzione di ordine superiore che sei
tutti familiari con così ho a
funzione che richiede un’eternità int
un altro numero intero e restituisce un intero
e questa è una funzione di ordine superiore giusta
quindi è una funzione che accetta una funzione
o una funzione che restituisce una funzione
e in Kotlin possiamo sapere di averlo
molteplici funzioni quindi posso avere per
istanza un GE qui che prende no
parametri e restituisce nulla di ricchezza
restituisce l’unità che è in realtà
diverso da niente giusto
è veramente unità non è niente unità è
un oggetto che è diverso da una classe
quindi quanti di voi sono JavaScript
gli sviluppatori qui è e non a
imbarazzo a mettere le mani così
oggetto è l’equivalente di oggetto in
JavaScript sai come sei passato
Java o C sharp to JavaScript e tu
come oh, prenderò tutto io
portato con me, così mi permetta di creare questo
sistema sorprendente in JavaScript chiamato
classi e gerarchie e di tutti
come no non farlo hai oggetti
nel chiamare abbiamo oggetti e abbiamo
l’oggetto classes è essenzialmente a
singleton questo è come si implementa a
singleton in Kotlin scrivi semplicemente
oggetto è che non devi comprare un
libro
che era un buon libro, a proposito
anche se ora al giorno d’oggi non si può dire
hai letto la Gang of Four che faranno
accigliato su di te sono come oh, non lo sei
facendo programmazione funzionale allora e così
Stavo dicendo che non è niente di giusto
perché niente è qualcosa in Collier
quanti di voi non hanno sentito nulla
okay quindi niente è qualcosa così è
fare qualcosa che non fa nulla e se io
ho unità e faccio eccezione questa
non fa nulla giusto, perché se lo scrivo
non fa niente , getta un’eccezione
ma se vengo alla mia funzione principale qui
e dico stampa nove ciao che lo faranno
lavoro se scrivo legge sulle eccezioni
non lo farò e se lo farò bene lo farò
eccezione e un cinque proprio dal
il compilatore dirà che questo non funziona
perché non lo raggiungerà mai
codice perché è stata generata un’eccezione
ma se scrivo qui, fai qualcosa che è
andando a non lavorare bene perché è
dell’eccezione tuttavia se rimuovo
questo e prendo questa linea qui e
Lo sposto verso il basso la linea di stampa è ancora in corso
supposto funzionare correttamente perché è
dicendo Beh, è che sta andando a lavorare è
chiamerò un metodo che arriverà
indietro e questa è la differenza tra
unità e niente perché niente
in realtà dice che questa funzione non lo è
andando a tornare lo farà
essenzialmente non essere nulla e ora lo è
dice che questo codice è irraggiungibile così
c’è una differenza tra unità e
niente e come dico sempre nulla
è nulla per voi di cui preoccuparsi in modo
andiamo avanti così abbiamo questo
qualcosa e abbiamo questo ordine superiore
funzione e una delle cose che noi
avere in Kotlin se hai familiarità con
ovviamente hai la corda
estensione hai la funzione
estensioni ma hai anche proprietà
estensioni giusto esempio molto buono di
questo è sempre come posso avere un lungo
che posso scrivere o un galleggiante che posso
scrivi usando letterale così posso scrivere dieci F
ciò significa che è un vero galleggiante e
noi
abbiamo lavorato con grandi decimali che noi
amato lavorare con voglio essere in grado di
scrivere grandi decimali questi dieci BD non posso
farlo, perché non esiste una letterale
per grandi decimali potrei fare il prossimo
la cosa migliore di ciò che crea un
proprietà di estensione, così bene che potrei
crea una funzione di estensione scrivilo
ma non sembra buono ma posso farlo
creare una proprietà di estensione così posso
crea un’estensione a numero intero per
istanza che restituisce un grande decimale e
allora questo tornerà un grande
decimale di questo diritto così che sta dando
me una proprietà di estensione va bene così uno di
i vantaggi di questo è che a parte
è molto bello da leggere
che puoi essenzialmente delegarli
la funzionalità di una proprietà a
qualcos’altro giusto per esterno
funzione che è possibile riutilizzare più e
più volte e questo è uno dei
benefici delle proprietà delegate giuste
quindi ho una lezione con un gruppo di
proprietà delegate e posso delegare
questi ad altre funzionalità e quindi
condividili su più classi e
è lì che abbiamo per esempio a
un sacco di delegati incorporati quindi tutti voi
probabilmente familiare con il delegato pigro
destra come molti di voi qui familiarità con
pigro così pigro è essenzialmente pigro
inizializzazione di una proprietà sta andando
per inizializzarlo al momento dell’accesso
la prima volta e sta andando
inizializza quel codice e non sta andando
per eseguire quel codice mai più e basta
fatto usando la dichiarazione della proprietà
pigro e poi usato da e poi pigro
che è il delegato integrato e quindi
Passo nella funzione effettiva che è
andando a inizializzare la nostra proprietà quindi se
andiamo oltre a pigri qui possiamo vedere
questo è un ordine superiore
funzione che richiede un inizializzatore
ha anche una versione sovraccaricata che
ti permettono di passare al diverso tipo
di inizializzazione che vuoi fare
sincronizzazione su proprietà condivise ma
questo è uno di quelli più comuni, ma
ci sono pochi altri quelli che sono anche
integrato nella libreria standard
uno di questi è il veto, quindi il veto
il muro è una proprietà delegata che
ti permette di dire se una certa condizione
è abbinato quindi aggiornare la proprietà
se no, non farlo bene senza di te
dovendo scrivere questa logica all’infinito
di nuovo così in questo caso lo sto dicendo
Ho la proprietà che ho un vecchio
valore ho un nuovo valore e dico
che se il nuovo valore inizia con una S
quindi aggiornare il valore se non è così
aggiorna il valore così qui dove siamo
creando per esempio un veto di classe e
allora io dico impostare il valore l’ho detto a
cambiamento che ho stampare il valore ho impostato a
strano, stampo il valore in
principio il valore dovrebbe cambiare solo
dopo che ho colpito strano, quindi se corriamo
questo lo puoi vedere alla prima chiamata
in realtà non sta impostando la proprietà
okay e sta impostando la proprietà
la seconda chiamata qui quando ho colpito
strano quindi questo veto palla pigro e
osservabili sono alcuni dei built-in
delegati che abbiamo nel
libreria standard che puoi usare ma
ovviamente puoi anche crearne uno tuo
delegazione di proprietà in comune e
essenzialmente quello che devi fare sei tu
devo creare una classe che definisce due
operatori uno di questi è chiamato get
valore l’altro è chiamato valore impostato
e molto come hai visto nel veto di tutti
esempio quello che sto ottenendo qui è un po ‘
informazioni sulla classe attuale quindi
Sto ricevendo informazioni su
proprietà K proprietà che cos’è la proprietà K
è proprio come proprietà ma prefissato
con una K che è qui e questo è un modo
spiegare Cortland
prendi tutto ciò che è Java e prefisso con
un K e quindi rilasciare le librerie con un K
intercalato con un C so che uno con
un K e questo è chiamato così K proprietà
è una proprietà Kotlin quindi è essenzialmente
riflessione migliorata a destra
quindi a Kotlin potresti essere consapevole di te
puoi usare la riflessione Java che puoi anche usare
Il riflesso di Kotlin è come Java
riflessione ma meglio ne ha un po ‘
cose aggiuntive che sono intrinseche
ingresso conoscenza intrinseca di Kotlin
come proprietà così questo è come te
puoi creare i tuoi delegati personalizzati e
quindi essenzialmente basta usarli
delegati ovunque tu voglia nel tuo
classi proprietà variabili di primo livello
ecc. va bene
quindi un’altra cosa che abbiamo dentro
collin è tipi di dati algebrici o noi
abbiamo rappresentato il nostro per rompere i dati
tipi con davanzale giusto quindi ecco a
semplice esempio di ciò che sarebbe un
algebrica tipo di dati che, se non siete
familiarità con questo concetto ora generico
tipo di dati di byte di dati è un tipo che può
essere un tipo o un altro, ad esempio
booleano booleano può essere di tipo true
scrivi falso così chiamandolo puoi farlo
essenzialmente fare la stessa cosa
dichiarando questo come un risultato aperto giusto
quindi qui ora quello che sto dicendo è mio
la classe può ereditare dal risultato e io ho
due casi questo è molto comune per
istanza se vuoi allontanarti
eccezioni o vuoi avere un
funzione che restituisce uno dei due
diversi tipi in caso di successo o
fallimento che si poteva fare qualcosa di simile
giusto e se lo fai questo è
assolutamente valido il problema con questo
è che se vengo qui, andiamo tutti
per esempio a un file e dico
classe a volte e talvolta eredita
dal risultato giusto che sta andando a lavorare
così giusto, perché risultato è un open
classe quindi se sto scrivendo codice che è
controllando che quel tipo di schifo
quello che puoi fare invece è contrassegnare la classe come
sigillato invece di aperto e sigillato
essenzialmente ciò che significa è che è
chiudendo la gerarchia va bene così ora
non puoi ereditare da quella classe
oltre a quello che hai tutto
ereditato e potresti chiederti cosa
è così bene qualunque cosa sia su quel file così
sigillato chiuderà la gerarchia a
quel file proprio qui a volte
non funziona più, ma qui a volte
funziona e questo non necessariamente
devi essere solo tu a seguire le tue lezioni
può anche averlo come fanno le classi annidate
hai una domanda o ti ho risposto?
oh sono troppo rumoroso è quello che è la mia famiglia
mi dice sempre che mi dispiace ci proverò e
parla un po ‘meglio è meglio
quindi sei seduto lì in questo modo
soffrendo di dolore, mi dispiace tanto
quindi ho II tinnito ora lo sai
come mi sento, tranne che non è la mia stessa voce
è comunque dannatamente squillante
quindi sono anche felice di sapere che il mio
le spiegazioni sono così fantastiche che tu
mi interessa solo il volume che è come
recentemente stavo dando che stavo dando un
webinar per un’ora un’ora a destra
webinar e ho avuto di tutte le persone uno di
i miei eroi Eric Meyer come moderatore
proprio così 50 minuti in cui nessuno lo chiede
domande e alla fine Eric dice come
abbiamo una domanda, io sono come sì?
è su Collin che è vero il ragazzo
Evan sono lì come si sta chiedendo qualcuno
cos’è quella freccia in IntelliJ IDEA
comunque quando sarò grande sarò un
programmatore numeri da 1 a 100 ora tutti voi
lo so a Collin se scrivo qualcosa
come questo e poi lo faccio per esempio
i numeri filtrano è inferiore a 10 o
diciamo che è divisore per 5 se potessi
digita e poi digli di prendere ciò che sta succedendo
accadere qui è ciò che questo è desideroso
valutazione giusta così essenzialmente è
andando a guardare l’intera lista
e poi filtrerà quelli
che sono divisibili per 5 anche se a
Alla fine della giornata tutto ciò che voglio è il
i primi 30 di loro
se vuoi avere una valutazione pigra
è possibile a Colleen tutto il necessario
fare è prendere qualsiasi iterable e chiamare come
sequenza su di esso non appena si chiama come
sequenza che ora diventa pigro valutata
proprio così essenzialmente lo stesso di Haskell
dove tutto è di default pigro
valutato quindi funziona con essenzialmente
tutto ciò che è iterabile se tu
effettivamente naviga verso una sequenza che puoi
vedi che è solo una funzione di estensione
su un Tribble quindi qualsiasi raccolta iterabile
tutto ciò che puoi sostanzialmente convertire in
sequenza e poi catena tutto il
metodi meravigliosi che hai quando
stai facendo il pipelining del metodo e allora
succede nei casi in cui non puoi
avere un intervallo per cominciare per quello
abbiamo altre funzioni come parte del
libreria standard e cioè generare
sequenza che ha due versioni una di
loro si siedono e poi su quel seme
puoi fare quello che vuoi e poi
da lì di nuovo filtro e tutto questo
di nuovo sarà pigramente valutato bene così
ci sono due modi per farlo come sequenza o
se non si dispone di una collezione per iniziare
con te puoi usare la sequenza di generazione
ok ora nella cosa precedente che hai visto
digita alias o sono ancora troppo forte oh
oh stai scansionando bene
giusto così nel precedente che avevi
digita alias un esempio di quando tu
voglio usare questo è ad esempio quello
che hai detto che sai che voglio avere un
gestore che è una funzione che va
da una stringa all’altra, ad esempio, a destra
se sapessi scrivere codice Kotlin e
o dimenticalo che non lo faccio
e questo è un uso che in realtà non lo faccio
come quello uso tanto perché uno dei
le cose che mi piacciono in giro per Kotlin sono le
scopribilità quando si guarda a
funzione sai esattamente cosa
i parametri sono così quando guardo a
funzione di ordine superiore e vedo int di
Intuit io esattamente cosa sta andando a
prendi non devo introspettare il tipo
per capire davvero cosa sta succedendo
prendere un altro caso utile di
digitare alias è per usarlo con
deprecato quindi quanti di voi proprio qui
api e spedisci quelle api alla tua
anche i clienti sono interni e tu lo faresti
amo rompere la tua api e poi tu
sai cosa puoi fare puoi effettivamente
vendere abbonamenti su di esso e poi quello
modo che puoi sempre aggiornare così per il
registrare JetBrains non vende API così
una cosa interessante che puoi fare
api è diciamo che ho una lezione
quindi andiamo avanti e in realtà rimuoviamo
tutte queste sciocchezze qui, quindi facciamolo
Dì che ho una classe chiamata cliente
giusto e poi ho una funzione principale
che sta usando questo cliente, quindi dico
bene cliente cliente eCos ora domani
Voglio venire e rinominare la mia arte
cliente al cliente fantastico adesso
se cambio il nome, questo romperà il mio
Api è così che quello che potrei fare è presentare un
nuovi valori TY che è fantastico
diritto del cliente che è essenzialmente a
cliente ok e quindi quello che potrei fare è
vieni alla mia classe cliente e aggiungi il
deprecato e dire che il cliente è ora
cliente fantastico giusto e vedere al più presto
come faccio quando aggiungo il deprecato
l’ ID sta per evidenziare questo e
dire che questo è un cliente fantastico ora
ma la cosa buona è che non l’ho fatto
Ho rotto la mia API in modo da poter fare un phased
aggiornamento giusto posso introdurre il tipo
Ali, noi abbiamo la gente che passa a quello
e poi alla fine nel secondo
versione rimuovere quel tipo di alias e in
Infatti, se sei stato a bordo con Kotlin
per molti molti anni ritorno quando noi
abbiamo usato per chiamare i tratti di interfaccia che voglio
per realizzare una t-shirt che dice
Stavo usando Collin quando era la nostra caratteristica
ha fatto questa migrazione graduale per Emory
ogni versione M facciamo questa fase
la migrazione prima ti avvisa e
quindi la prossima versione sarà a
errore del compilatore e puoi effettivamente utilizzare
l’IDE per risolvere questo per te in modo che tu possa
diciamo che si sostituisce al fantastico cliente
e quello con cui si sostituiscono è quello
ora ti dà la magicamente alt-enter
giusto così ora hai la sostituzione con
cliente fantastico, quindi è un altro uso
che potresti usare per digitare alias a
fare una migrazione di fronte va bene alcune cose
attorno ai funzionamenti in linea
giusto quindi andiamo a un ordine superiore qui
l’abbiamo visto giusto così in questo caso
cosa che abbiamo con la colonna è è
funzioni inline e infatti se si guarda
a molte delle funzionalità in
libreria standard puoi vederne molti
le cose sono in linea , puoi vedere
che molte di queste funzioni sono dentro
linea e la ragione di questo bene se
sei chi è familiare qui con inlining
giusto così per coloro che non hanno familiarità con l’ inlining
essenzialmente cosa significa che è
copia / incolla destra così invece di me
chiamare quando invochi una funzione quando
tu chiami operazione invece che in realtà
invocando e avendo tutta la chiamata
stack associato a ciò che è
andando a fare è andare a copiare che
funzione e incollalo esattamente dove
lo stai invocando, va bene così
senso per farlo con funzioni che sono
piccolo sai che non lo fai con
funzioni che conosci 200 righe di
codice
ora, naturalmente, se hai funzioni simili
sono 200 righe di codice il tuo problema è
perché hai funzioni che sono due
centinaio di righe di codice non inlining
ora con Kotlin lo fa davvero
senso di fare inline quando le tue funzioni
sono funzioni di ordine superiore non solo
funzioni generali, ad esempio se io
dovevamo creare una funzione qui chiamata
divertimento amico mio e questa funzione ha un
intero e poi aggiungo un inline
ad esso qui puoi vedere che il
compilatore sta per darmi un avvertimento
e sta andando a dire che il mio amico a
la linea è insignificante la prestazione
guadagnato nel rivestimento di questa funzione è
insignificante nella fodera funziona meglio per
funziona con lambda come parametri
va bene in questo caso non lo dice
perché in realtà ho un lambda come a
parametro quindi cosa significa questo
quando creo questa funzione inline è
non solo andando in linea la chiamata vera e propria
a questa funzione ma lo farà
in linea anche il parametro
a destra è lì che si ottiene alcuni dei
vantaggi ora ci danno le funzioni inline
un altro vantaggio che vedremo
in un momento ma ci sono momenti per
qualunque sia la ragione, ad esempio tu
vogliono essere in grado di tenere un riferimento alla
un fattore in linea per un ordine elevato in a
funzione che viene passata in questo
parametro che non si può fare con
funziona in linea ciò che è
passato nei lambda tutto quello che puoi fare è
essenzialmente li invociamo così ci sono
volte in cui si desidera che determinate funzioni
non essere in linea che in questo caso puoi
decorarlo con un no in linea quindi se io
avere per esempio un altro ordine superiore
funzione qui posso decorare il secondo
uno senza diritto in linea così ora è
dicendo che mentre l’inlining è applicabile
in questo caso perché ho un lambda
che è in linea
per alcuni casi non voglio che sia
in linea va bene c’è un altro fatto che c’è
un altro che si chiama croce in linea
che non ho intenzione di darti
spiegazione di perché per quello sei
andando ottenere un cioccolato in modo da andare in movimento e
google it
quindi anche l’ inlining ci dà certezze
benefici giusti e cambia anche
un po ‘un comportamento e questo è dove noi
vieni a ritorni così qui ho un
funzione che viene chiamata contenente
funzione e in pratica scorre attraverso
un elenco di numeri e poi sta andando a
fare un ritorno se dovessi eseguire questo cosa
pensi che l’output di quello sarebbe
niente niente non restituisce nulla
è un’unità di ritorno che sto scherzando
chi dice nulla che dice ciao chi dice
sono io no, non capisco
Adele oh mi dispiace che non sia andata male, si
hai sentito peggio ora oh si e tu
Ho chiamato Adele, va bene, sì
deve aver succhiato bene, sono così se corro
questo non restituisce non stampa
uh non viene eseguito cosa ho fatto
Oh G parametro G dov’è il mio G op no solo
rimuovi quello che succede quando io
fai la programmazione in tempo reale, quindi torna ai ritorni
se eseguo questo, tornerà
niente è giusto ciò che mi dispiace
non stampa nulla
ora prima capiamo perché dare un’occhiata
in questo esempio questo è il mio inline
funzione c’è un intervallo del mio per
ognuno e questo è esattamente lo stesso di
ognuno di fatti se si naviga per ciascuno
da qui a destra dividiamoci verticalmente
e allora io tornare a voi i rendimenti
posso vedere che il mio per ciascuno è essenzialmente
lo stesso come per ogni qui che ora
è morto per me
ma comunque è esattamente la stessa fiducia
me se io se corro contenente la funzione
con il mio per ciascuno cosa pensi che sia
andando a stampare ciao
o non stamperà nulla di buono se lo è
esattamente uguale all’altro per ciascuno
non stamperà nulla di giusto
era una domanda trabocchetto
comunque non stamperà nulla
nota una cosa che non avrei corso
questo se rimuovo l’ inline non posso
ritorno a destra e questo è ciò che viene chiamato
restituisce non locali il fatto che questo sia
tornando fuori
il fatto che non stia stampando ciao è
perché il ritorno sta tornando da
contenente la funzione perché sta tornando
dalla funzione di contenimento perché per
ognuno è una funzione in linea quindi esso
significa che è essenzialmente copiando incollando
il codice in linea e quando chiamo ritorno
c’è solo una funzione con cui tornare
che è la funzione di contenimento, quindi cosa?
succede in questo caso bene in questo caso
non puoi effettivamente fare un ritorno non locale
perché le funzioni sono solo i rendimenti
applicabile direttamente quando invocato come
questo sono applicabili solo in linea
ora funziona cosa succede se voglio
effettivamente tornare al contenitore
funzione e non all’invocazione di
la funzione di contenimento utilizzo un’etichetta n
questo non è un tentativo di piacere , non lo è
ok questo non è un andare a è un andare più bello
è un atto quindi uso Ad e AD è il
nome effettivo della funzione non sono questi
costruito in etichette proprio se io se il mio
la funzione è stata chiamata il mio foreach allora
sarebbe al mio foraggio e in effetti tu
posso anche prefissarlo con un’etichetta
posso dare quell’etichetta lambda così posso dire
la mia etichetta e poi tornare alla mia etichetta ora
se non sei a conoscenza in Collin che abbiamo
agnello bene, sai che li abbiamo visti
giusto questo è un lambda intendo dove come
il mio ordine superiore se scrivo principale è questo
un lambda quindi se scrivo F in ordine superiore
e poi da X a X più qualcosa che è un
lambda giusto
questo è un lambda che in molte lingue
è chiamata la stessa funzione anonima in
coordinate non abbiamo anonimo
funziona pure questo è un anonimo
funziona bene è letteralmente lo stesso
come in JavaScript, quindi ho una funzione
senza nome dove posso passare nel
nome del parametro effettivo e quindi fare a
ritorno nel caso di un anonimo
funzione esegue un ritorno locale
al contrario di un lambda che significa così
se vuoi i ritorni locali puoi farlo entrambi
utilizzare etichette o funzioni anonime ok
si, cosa intendi?
ma non è per quello che ho appena mostrato
tu puoi usare per le funzioni anonime
questa è una domanda che è meglio chiedere
da Andre immagino che non ci sia
ci sono molte ragioni per cui ne facciamo un po ‘
cose a Kotlin per alcune di loro
motivi di prestazioni per gli altri
attrezzo da tenere in considerazione anche se molto
di volte in cui la gente ci dice perché
dovrei usare Carlin se Scala è giusto
come Kotlin ma mi permette di saperne di più
più cose perché la flessibilità e
la versatilità che Scala ha anche
rende estremamente potere dell’arte di fare
strumenti e prestazioni saggi non è così
performante giusto quindi ci sono
potrebbero essere alcune ragioni a volte che noi
fallo per la prestazione altre volte
potrebbe significare che stiamo facendo qualcosa perché
stiamo andando ad aggiungere in seguito un’altra caratteristica
che consentono di essere in grado di distinguere
stiamo usando questo in anticipo giusto
ok ora con l’inline che ho detto
l’inlining va bene per motivi di prestazioni
l’ altro è per la reificazione
dei generici va bene così se sei familiare
con la JVM che probabilmente sei tu
sappi che abbiamo questo piccolo piccolo
problema chiamato tipo cancellazione proprio così
quello che puoi fare con Kotlin è qualsiasi
funzione inline è possibile aggiungere il refight
parola chiave ad esso e che poi consentirà
di fare certo tipo di controllo sulla
tipo generico giusto quindi in questo caso posso
dire è l’input di T se rimuovo reificato
mi dice che non posso farlo bene così
reificazione e se rimuovo in refight
vedi che ricevo di nuovo l’avviso
giusto dice la performance
il miglioramento qui è minimo perché tu
non ho una lambda, ma non è così
appare quando sto usando il refight
perché mi permette di prenderne un po ‘
informazione a volte va bene un’altra
La cosa che abbiamo in Cortland è bene
avere questo in molte lingue, ma lo è
varianza covarianza e controvarianza
quindi ecco alcuni codice questo è un mutabile
elenco di qualsiasi
e questa immutabile lista di stringhe e se
Io disapprovo che questo funzionerà sì
o no ti darò un suggerimento
il motivo per cui è commentato è perché
Controllo sempre che questo progetto
compila prima di fare le demo così è
non andando a lavorare perché non lo farà
lavoro così ho una cosa che sai una stringa è una
sottotipo di qualsiasi variante tranne che sta scrivendo
varianti ma perché non funziona spiegare
a me perché questo non funzionerà correttamente e
questo è quello che sta dicendo, ma si
no, non sto dicendo come aggiustarlo
dicendo perché non funziona bene si
si e immagini immagina molto più facile
esempio per voi per vedere questo sarebbe
essere molto ovvio come se stai passando un
elenco mutabile a una funzione e tu passi
se una funzione di tipo any nel tuo
stringa di tipo passiva la funzione è di
tipo qualsiasi così essenzialmente dentro
funzione è possibile aggiungere qualcosa a questo
elenco giusto perché è spento tipo any e
eppure se passi in una serie di
stringa non è possibile aggiungere un numero a un an
array di stringhe, no, ho appena detto
loro la risposta per cui ne ho di migliori
cioccolata grazie, lo farò , è così
è cioccolato fondente o è latte I
non lo voglio
quindi ora funziona, perché funziona?
perché è immutabile vero e proprio
impostazione predefinita nelle raccolte di elenchi di Kotlin
sono tutti immutabili al contrario di
mutabile è per questo che devi scrivere
bello ok ora in colonna non lo facciamo
abbiamo chiamate varianti del sito ma cosa?
puoi fare è puoi dichiarare certo
tipi come questo elenco qui è questa lista
se vai alla dichiarazione puoi vedere
che questa lista è giusto controvariante
che sta indicando ciò che abbiamo appena
fatto è possibile e in Kotlin questo è
espresso senza ok così hai fuori
e tu hai così abbiamo una dichiarazione
varianza del sito che significa che noi
dichiarare la covarianza o il
contravarianza di quel tipo al
dichiarazione sito hai anche tu sito
varianza quando si sta interrompendo con
java per esempio o in uno specifico
funzione puoi chiamarti varianza del sito
ma generalmente in Kotlin lo fai
variazione del sito di dichiarazione che significa
E ‘grande perché non devo avere
questo punto interrogativo si estende a tutto questo
che facciamo costantemente in Java la regola
di pollice qui è davvero semplice è se
la tua classe sta consumando solo allora
covarianza e in effetti l’IDE può dire
tu dici che stai solo consumando
qui in modo da poter aggiungere il in per fare questo
covarianza se stai producendo, allora è
sta per essere controvariante e si sarebbe
aggiungi l’out okay per riassumerti
avere covarianza e contravarianza
può dichiararlo al sito di decorazione
e puoi anche usarlo in modo specifico
casi su siti di chiamata ora cerchiamo di entrare in
alcune delle altre cose intorno alla colonna
che è dsls okay, facciamo un po ‘
codifica qui, quindi, quanti sono familiari?
con DSL quindi linguaggi specifici del dominio
dsls sono fantastici, ddd me Scott, non lo so
sai perché Ross Scott va a posto e basta
come chiamiamo le cose che vengo dalla Spagna I
non intendevo quello come un insulto
no e una volta stavo per andare
per venire sono andato in una compagnia prima di me
sono entrato in Jabbar e stavo facendo consulenza e
Sono andato a due ti dico questa storia
perché questo è veramente vero io
sono andato a una società di consulenza e lo ero
facendo la revisione del codice e hanno avuto un
funzione che è stata chiamata così chiunque
parla spagnolo qui va tutto bene
Lo spagnolo quindi è stato chiamato per prendere un Manolo
scrivere e andare a prendere il suo Manolo un mezzo
data e Manolo è Manuel un nome e io
disse quello che è una Manola e lui disse
è una funzione che abbiamo scritto per Manolo
perché Manolo voleva la data in questo
formato specifico e ho detto ma c’è
ci sono due Manolo qui e hanno detto
no, è un manuale che è l’abbreviazione di Manolo
Manuel e questo Manolo l’ ho detto
cosa succede se vuoi una variazione lui
dice bene lo chiameremo solo mio
Conoscenza che scrive e non scherzo
questo è il codice che è là fuori comunque
quindi tutti voi conoscete la funzione
le estensioni nelle chiamate così posso scrivere è
stesso come valore stringa e quindi lo faccio per
esempio questo equivale a valore giusto e se
ancora una volta ero solito sapere come scrivere
Codice Kotlin ci vai così questo è un
funzione di estensione quindi posso dire ora o
questo è lo stesso di questo diritto e posso farlo
Questo
anche nella notazione infix che posso
basta scrivere così e sbarazzarsi di
quello e la parte migliore del fare
le demo in Kotlin in IntelliJ sono perché io
non ho nemmeno bisogno di sapere Kotlin, solo
colpisci alt enter e posso farlo entrare
correggi e ora è fantastico perché adesso
Posso chiamare una notazione infissa e questo
inizia a dire oh questo sembra carino
Sembra genere della DSL, come giusto o
il nostro BDD bene quindi questo è il questo è il
cosa tipica che vedi in Kotlin
in questo momento DSL è un po ‘ più lontano
con il cotone e quello che non potremmo fare è
proviamo e creiamo per esempio un DSL
questo mi permette di fare qualcosa di creativo
quadro sugli sviluppi del web come
molti di voi hanno familiarità con Express
Jas o Ruby o Sinatra e cose simili
giusto quindi voglio fondamentalmente creare
una funzione che ha per esempio un get
che prende un percorso di tipo stringa e
poi prende un gestore giusto e il
gestore sta andando a prendere per esempio un
richiesta che è una richiesta HTTP e a
risposta e restituirà unità
e poi avrò una lezione
richiesta che per esempio prende la proprietà
di tipo accetta e ho intenzione di avere un
risposta di classe che prende per esempio
codice di stato della proprietà di tipo finisce e di
il nostro contenuto di tipo stringa proprio così ora
Potrei fare qualcosa tipo tornare a casa
ora sono a Cortland, ricorda se il
ultimo parametro a un altro a una funzione
è un’altra funzione in cosa puoi fare
Kotlin invece di racchiuderlo
qui puoi racchiuderlo al di fuori del
parentesi destra così potrei allegare questo
qui va bene okay
e andiamo a dare il nome a questo
come root, per esempio, okay, perché?
dandomi un errore il quale richiedente oh
si, va bene così sì , ora devo fare
richiesta di risposta e quindi devo fare
per esempio se le richieste accettano echos
applicazione JSON proprio allora qualunque cosa
come ad esempio il contenuto della risposta è uguale
qualche JSON giusto e adoro la chiave di fuga
dal modo in cui sai come scrivere JSON in
IntelliJ right alt enter iniettare JSON e
poi fai alt enter edit JSON framment
e poi lo fai come se non lo facessi
siediti e fuggi dai personaggi
va bene così ora questo è bello il problema è
che ho tutta questa orribile richiesta
risposta e le parentesi graffe e tutti
quella merda e questo sembra un po ‘ schifoso
ora quello che posso fare è che posso rimpiazzarlo
con il gestore, ad esempio, destra crea a
tipo chiamato gestore di quell’handler a sua volta
accetta un oggetto di richiesta e una risposta
oggetto giusto e quindi quello che posso fare è
dato che a Kotlin potrei potenzialmente se
c’è un singolo parametro per una funzione
sostituirlo con quello di cui potrei liberarmi
la dichiarazione esplicita qui e poi
questo lo prefissa con giusto e
allora la richiesta diventerebbe richiesta e
la risposta sarebbe diventata una risposta okay
ora sembra bello ma di nuovo è così
esso
è quel miserabile che voglio ottenere
liberarsi di così
come posso fare questo voglio fare proprio come
se richiesta, come posso farlo così tu sei
tutti familiari con le funzioni di alto ordine
le giuste funzioni di ordine superiore sono ciò che
funzioni che prendono altre funzioni o
funzioni di ritorno cos’altro abbiamo in
chiamato oltre alle funzioni che abbiamo
funzioni di estensione quindi perché non combinare
i due perché non creare un ordine superiore
funzione che non prende solo un
funzione ma richiede una funzione di estensione
quindi quello che potrei fare è invece di questo
assumendo una funzione posso dire che voglio
ottenere la root per prendere una funzione di estensione
e il modo in cui lo fai è prefisso
con un punto simile a come dichiari
una funzione di estensione quindi ora sto dicendo
quella radice diventa root richiede un’estensione
funzione ora dato che questo è un
funzione di estensione qui significa questo
che questo lambda è quello che è un membro
di gestore dal momento che è un mammifero di
gestore che cosa ha accesso ad esso
ha accesso alle proprietà di quel Handler
il che significa che posso sbarazzarsi di esso
okay e ho il mio bel po ‘
sintassi più bella qui mi sta seguendo bene
ora questo è anche bello ma voglio andare
un passo avanti e se volessi fare
qualcosa del genere e se volessi fare
qualcosa del genere
giusto contenuto ora seguiamo lo stesso
modellare il problema qui è quello
la risposta ora è di che tipo e
essenzialmente quello che sto facendo qui è io
voglio fare quello che voglio invocare un tipo
giusto perché questo è un lambda
quindi sto dicendo come posso invocare un tipo
non è possibile in realtà è in
chiamarti puoi creare una classe foo e
allora puoi dire che voglio creare un nuovo
istanza di foo right e then in foo I
posso dire ciao e poi questo dirà
ondulata e dirò di no e cosa farò
fare è creerò un operatore che è
chiamato invocare in modo che ora mi permette di
invocare un’istanza dato che posso
invocate bene un’istanza perché no
Faccio solo la stessa cosa qui perché no
Invoco un caso come faccio a farlo
bene, qual è la risposta è un tipo
così
Devo fare è creare un operatore
invocate per il tipo di classe e io lo farò
dì a IntelliJ di farlo per me ora arriva
la domanda su cosa passerò nella sua
parametro bene di cosa ho bisogno qui io
bisogno di contenuti ciò che è contenuto è un
proprietà di risposta
quindi creo questo come un’estensione
proprietà al significato di risposta che ora ho
il mio contenuto va bene ed è così che tu
crea le loro cellule in Collin ora
questo è solo un esempio di DSL e il
la bellezza qui è esattamente ciò che abbiamo visto
è questo quando parliamo di persone DSL
rapidamente single come non ho intenzione di
crea il mio HTML no, non lo sei
la bellezza di DSL è la piccola DSL che
si crea attraverso la vostra giusta applicazione
se combini questo qualcosa con
Il laboratorio di Alberto intorno al
progettazione basata sul dominio ciò che è uno dei
idee dietro il design orientato al dominio mi dispiace
questo è un altro workshop sul dominio
durante il design l’idea è di avere questo
concetto del linguaggio ubiquitario giusto
se sia dove il business
allinea con il modo in cui scrivi il codice pensa il
potenziale che potresti avere qui proprio tu
potrebbe avere l’ ufficio delle imposte olandese definire
le loro regole in cotone sono come la mente
soffiato in realtà ero alla tassa olandese
ufficio e ho detto loro così
e hanno detto che inizieranno
guardando Cartland così ci sei tu
l’affare era se mi trasferisco ad Amsterdam ottengo
come una riduzione fiscale di massa
non essere fico, lo faccio comunque
sì comunque è un po ‘come il
roba di dsl a Cortland, giusto e questo è
dove puoi usare questa macchina e puoi
usa questa roba per creare meravigliosi
little dsls per il tuo dominio
design per il tuo file di configurazione per
tutte queste cose le abbiamo usate
in modo estensivo, ad esempio in team city
qual è la nostra continua integrazione
server ora abbiamo creato lo strumento dsl come
ti consente di definire tutti i tuoi
configurazione con cotone di destra Gradle
lo ha adottato per lo stesso scopo
okay tutte le domande si in che senso
sarebbe la prestazione
Non credo che sia apprezzato ho
non pensare che sia come sarebbe
in questo caso minimo, so che non vedo
un problema in termini di prestazioni va bene
rapidamente mi resta qualche minuto
giusto così ti faccio vedere un po ‘di fretta
le cose intorno a che cosa è questa cosa che
vedremo il karate
sì karate, ok, quanti di voi hanno
guardò in co-routines e Colleen
le routine di Cole sono fantastiche
il modo migliore per fare le cose
Sto scherzando um così bene che non ho
internet quindi non posso mettere il mio meraviglioso
scorre su ma quanti di voi facendo un
programmazione sincrona adesso come
molti di voi fanno discussioni mi piace
Callback JavaScript piace moltissimo Va
Parte JavaScript della parte callbacks
proprio così i fili sono complicati tutti noi
sapere che tira indietro succhia perché il
problema con callback è che hai un
funzione che lo chiama una volta
completarlo richiamerà un altro
funziona il problema, naturalmente , tutti noi
so che non è solo una funzione
quella funzione dovrà quindi chiamare
un’altra funzione come callback e quindi
un’altra funzione come richiamata e così via
e così via e benvenuto al
meraviglioso mondo di JavaScript che
sembra un albero di Natale inclinato a destra
perché quando metti tutto il piccolo
conosci frecce come questa sembra
un albero di Natale se lo guardi
orizzontalmente a destra e poi ovviamente
lesioni nel mondo di JavaScript fanno il
normalmente con la gestione degli errori di callback
è anche problematico, quindi di solito il
primo parametro in JavaScript di
la convenzione era per errore
ovviamente alcune persone pensano che sia un evento
o per eccitare così non lo fanno nemmeno
gestire gli errori così in Coleen che abbiamo provato
adottare un approccio a un sincronismo
programmazione e programmazione concorrente
usando questo concetto generico che all’interno
intorno dagli anni ’70 o se non prima di me
pensa agli anni ’50 chiamati co-routines
destra o sospendere i calcoli a base di erbe
sotto le coperte le co-routines sono
essenzialmente la stessa identica cosa di
richiamate tranne che non sei preoccupato
su come fare i callback
è il compilatore che è
i callback hanno il diritto di compilare il compilatore sotto
le copertine stanno creando la macchina a stati
assicurandosi dove il compat dove quando
quando sei di fronte a sospeso
la funzione è chiamata può essenzialmente
riprendere ad un certo punto in cui può riprendere
tutto questo è curato per te
sotto le coperte dal compilatore e il
modo in cui lo abbiamo fatto in cotone è
essenzialmente aggiungendo una sola parola chiave
della lingua chiamato sospendere il diritto e
il vedere che la sospensione è questa
la funzione è finita qui è questa parola chiave
qui sospendere e cosa significa sospendere
che questa funzione può essere essenzialmente
sospeso in un certo punto del tempo e poi
a un certo punto ripreso bene, quindi pensa
su una funzione che puoi mettere in pausa e
riprendere a destra Cortine prendere questa idea di
avendo sospeso i calcoli a base di erbe dove
Posso chiamare una funzione sospenderlo
continua qualcos’altro riprendi quello
funzione recuperare le informazioni e così via
e così via e facendo questo a
livello del compilatore che significa che non lo fai
bisogno di primitivi che significa che se tu
stanno prendendo di mira JavaScript con Kotlin
targeting della JVM con la chiamata no
doversi preoccupare di avere una piattaforma
inserisce una piattaforma che non ha thread
tutto questo si sta prendendo cura di te sotto
le copertine del compilatore per capire
come lo fa con
fili leggeri e quando dico
fili leggeri voglio dire così ecco qui
un esempio in cui ne ho uno da cento
mille posti di lavoro che sono essenzialmente
discussioni che sto lanciando e che sto per fare
fare un sonno filo e poi ho intenzione di
stampare un punto quando il thread dorme
e ho intenzione di eseguire questo va bene così io sono
gestirò le discussioni okay, vado a correre
questo cosa pensi che i risultati vadano
essere fuori di memoria si
e guarda la mia fantastica cosa nyan cat
memoria insufficiente per creare nuovi
filo
okay, farò lo stesso con
co-routines e kolaches puoi
essenzialmente vedere che è esattamente il
stessa cosa tranne invece di uno due
lavori un dente sotto giuramento che ho creato
una lista ho questa piccola cosa qui
chiamato lancio che non è necessario
mi preoccupo per ora ho
questa cosa si chiama ritardo che è
essenzialmente come thread sleep e
Ho stampato se corro questo che fai
penso che succederà è ovvio, vero
perché se fallisse ci sarà un
demo davvero merdosa quindi questo è in realtà
andando a correre e finirà ed è
stampato centomila fili
giusto e infatti posso stampare a
milioni di thread giusti e mi consente di
riprendi fiato e cosa sta facendo
è davvero un filo leggero proprio così
sta sospendendo le funzioni facendo il lavoro
sospendendo il lavoro sospendendo
riprendere indietro e che sta facendo questo
usando cercando di farlo in un modo che è
familiarità con il modo in cui si codifica già
quindi l’ idea principale dietro le co-routine è
che continuo a lavorare nel modo in cui ho
di solito ha funzionato bene senza doverlo fare
conoscere nuovi operatori con no
dover conoscere nuovi modi di
scrivere un codice sincrono ne ha uno
hai giocato con Java rx proprio così Rx Java
la prima volta ti presentano rx
Java ti dicono che tutto è a
stream ed è osservabile e gentile
di pensare a cosa diavolo hai appena detto?
per me
giusto e l’ idea è che ti allontani
da un valore discreto o te ne vai
da te sai nello specifico set di
valori a un flusso di valori che tu
continuamente può iscriversi all’utilizzo
ciò che è essenzialmente un modello osservabile
Rx è praticamente un osservabile
modello con una serie di operatori su
in alto e se hai fatto rx sai
che è necessario disporre di un cambiamento di mentalità per
allontanarsi da un certo modo di
programmazione in un modo diverso di
programmare con le co-routines l’idea è
che non lo fai con le co-routine
l’idea è che tu continui a programmare
nello stesso modo in cui verrebbe effettivamente preso
uno sguardo a questo codice è proprio questo codice
chiamando due funzioni e misurando
millimetri è una libreria standard
funzione che misura solo per quanto tempo
codice che il codice sta per prendere e quindi
Ho intenzione di chiamare la funzione di una funzione
due e stampare il risultato di uno più
due questa funzione ha una sospensione è
ha chiamato questa cosa magica chiamata sospendere
il che significa che è una funzione sospesa
e questo ha una sospensione
anche se corro questo per quanto tempo
pensa che ci vorrà un secondo
facciamolo, non prenderà né l’uno né l’altro
uno o due ne prenderanno duemila
quindici millisecondi che è leggermente
più di due secondi quindi sì, ci vorrà
due secondi il punto è che questo
è esattamente quello che ci si aspetta
Sto facendo funzionare una funzione e quindi sono
eseguire un’altra funzione
l’idea dietro le co-routine è che io
continuare a lavorare come sono allora
stai dicendo che cos’è il maledetto
punto degli altri perché questo non lo è
in esecuzione sul thread principale è
potenzialmente non bloccare il thread principale
più perché c’è questa cosa qui
chiamato blocco ROM che sta per
bloccare ma dimenticare il nome che sta per
bloccare il thread principale fino a qualsiasi core
di routine non uso così mi permetta di ottenere a quella
quindi questa è una funzione sospesa, giusto io
non può solo venire e avere una funzione principale
ecco se prendo una funzione principale
qui e dico la funzione uno non lo è
intenzione di lasciarmi chiamare perché questo
dice che questo sta sospendendo la funzione in modo che il
funzione che chiama questo deve essere
in grado di sapere come gestire le sospensioni
sospendendo le funzioni in modo da poter solo
chiamare sospendere le funzioni da altri
sospendendo funzioni la voce principale
punta a un’applicazione che potresti usare
qualcosa come il blocco della ROM o alcuni
altro meccanismo che vedrai ma
Il blocco della ROM è un po ‘come un aiuto
metodo che ti permette di invocare
sospendere funziona il fatto che questo
sta facendo questo significa che non è più
bloccando il thread principale che avevi a
domanda
thread thought join è essenzialmente
aspettando i fili proprio qui lì
non è una minaccia o partecipare alla minaccia o partecipare
in che senso è diverso come in
thread che mi unirò a te stanno lanciando 30
fili giusti e poi stai aspettando
per loro di aderire okay ma devi
aggiungere un po ‘ad un certo punto per aspettare il
discussioni per aderire e stai lanciando
discussioni va bene in questo caso al
pratico come il in termini di
risultato non è non c’è differenza
la differenza è che non ci sono
i fili qui vanno bene questi sono leggeri
discussioni Otis
ok, ma il punto è che questo è
dall’alto non è magico perché uno di
le cose che preferiamo in Kotlin è
che quando vuoi la concorrenza ti serve
per essere esplicito giusto e questo non lo è
concurrent questo è sequenziale quindi come
lo faccio in concomitanza in questo modo simultaneamente
ho una sintassi chiamata sink e sink
non è una parola chiave del linguaggio un lavandino
è essenzialmente una libreria chiamata parte di
la biblioteca di co-routines di Kotlin e io
pensa cosa sta facendo ora in questo caso
sta dicendo che sì questa funzione è
ora un freddo sincrono così in questo caso
lo eseguirà contemporaneamente
il che significa che il tempo sarà uno
seconda destra se hai familiarità con
c-sharp questo sarebbe simile al
una sincronizzazione attende in c-sharp la differenza
è che qui in realtà posso ottenere il
valore invece di ottenere un compito e
quindi ispezionando il valore di quel compito
e puoi fare delle cose interessanti con
routine di codice come ad esempio anche
avere chiamate sincrone che sono pigramente
valutato quindi per esempio qui sono
definire una funzione una funzione
due e poi dico risultato un’attesa e
risultato aspettare come prima
la differenza è che sto passando a
parametro chiamato pigro cosa fa
significa che ciò significa solo
inizia questo co-routine quando è
necessario che significa quando viene chiamata un’attesa
il che significa che in questo caso ciò funzionerebbe
due secondi giusto perché fino a un peso
non è chiamato qui , in realtà non lo è
devi chiamarlo okay così sai
co-routines si il pool comune
quindi le co-routines usano questo leggero
discussioni per così dire e il possibile
lanciare questi in diversi contesti
contesto in modo che il pool comune sia uguale a a
comune stagno di filo per così dire
potresti lanciarlo dentro e poi
ci sono diversi parametri che puoi
ad esempio, non confinato
nel senso che io so che non è così
importa dove lo lanci tu puoi
lanciarlo in un posto e riprenderlo in
un altro
questo essenzialmente lo sta restringendo a a
pool comune specifico che potresti anche
crea il tuo contesto threaded e
associarlo a quel thread
contesto il punto che sta qui è che può
Vado due minuti fuori bordo grazie
il fatto di essere qui è che dovrei
ho fatto questo quando ho iniziato il lancio
Studio Android in realtà ora dovrei
ho lanciato l’emulatore prima ancora di me
volò fuori da Malaga il punto qui
essere è quello che stai lanciando a
routine khole quando passi in comune
pool posso effettivamente passare in altre cose
hai familiarità con il nostro ex Java così
iscriversi su pubblica su una specie di simile
e posso effettivamente lanciare sull’interfaccia utente
filo anche a destra
quindi ecco un esempio questo è come questo
è per me per Android come non lo faccio io
non sapere nient’altro che come lanciare
questa app in Android ok e questo è il
solo ora ho mai aperto Android Studio
quindi questo è Android questo è un
applicazione che essenzialmente è
lancio di Fibonacci sul thread principale
per così dire giusto e sta calcolando
Sequenze di Fibonacci sul filo principale
e ogni volta che clicco questo è
calcolare una sequenza di Fibonacci a destra
e vedi che l’interfaccia utente sta aggiornando e
quando continuo a fare clic su questo continua
aggiornamento e sta aggiornando questo sul
thread principale quindi non ho nemmeno bisogno di
preoccupati perché sta prendendo
cura di assicurarsi che questo stia arrivando
di nuovo sul thread principale, quindi questo è il
parametro di contesto che si sta passando
si simile si okay sì sì Cora teens
sono una libreria separata che vengono spedite
questo è chiamare le co-routine quando ci provi
per favore provateli ora per favore usateli
quando li provi per la prima volta, l’ID sta andando
lamentarsi e dire che questo è un
funzionalità sperimentale puoi vederlo
dice la correzione sperimentale che se ho appena detto
ci vai tu basta aggiungere questo e poi
non più sperimentale è tutto
meraviglioso
la ragione per cui l’abbiamo fatto
era sperimentale
perché il marketing non era coinvolto nel suo
una parola completamente sbagliato siamo è
siamo completamente seminati
usando un’introduzione, infatti, c’è un
nuovo framework da cui abbiamo creato
il terreno per chiamare il framework web
chiamato Couture che sta usando
co-routines da zero siamo
usando un codice di produzione lo faremo
mantenerlo quindi non ti preoccupare di questo
la bandiera sperimentale lo ignora semplicemente
non lì non fa parte dello standard
libreria come parte della libreria chiamata
co-routines Kotlin X chiamato Linux o
co-routine
l’unica cosa che abbiamo aggiunto al reale
il linguaggio stesso era la parola chiave chiamata
sospendere okay
[Applausi]
Please follow and like us: