JavaRush /Java Blog /Random-IT /Lambda e stream, solo pratica, nessuna teoria

Lambda e stream, solo pratica, nessuna teoria

Pubblicato nel gruppo Random-IT
Ciao a tutti. In occasione del concorso ho deciso di scrivere qui non un articolo, ma una breve lezione. Riguarderà lambda e flussi in Java. Se li conosci già e li usi, vai direttamente alla fine dell'articolo, ci sarà una piccola selezione di attività con JavaRush su cui puoi esercitarti. Hai bisogno di Java 8 e versioni successive, formazione da JR, ci saranno pochi dettagli e molte cose incomprensibili, un forte desiderio di capirlo. Per cominciare, non spiegherò la storia dell'apparizione di lambda e flussi, semplicemente non la conosco da solo. So solo che provenivano dallo stile di programmazione funzionale, al nostro stile OOP. Nella mia breve esperienza di apprendimento, ho semplicemente mostrato come e cosa, alcune persone trovano difficile comprendere l'idea, quindi ricorda solo come scrivere, capirai più tardi.

Lambda

Lambda e stream, solo pratica, nessuna teoria - 1Lambda e stream, solo pratica, nessuna teoria - 2Se non sai cosa sono i lambda, allora: Un lambda assomiglia a questo:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Per ora basta. Puoi leggere la teoria qui: link uno , link due , ma penso che la pratica sia molto più divertente. Ti suggerisco di risolvere il seguente problema: Scrivi una calcolatrice utilizzando il metodo 1. Il metodo dovrebbe accettare 2 valori digitali e qualcos'altro. Il tuo codice sarà simile a questo:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
È necessario inserire 3 parametri nella firma del metodo calculate, aggiungere 1 comando returne provare a chiamare questo metodo in main. Cosa dovrebbe essere in grado di fare questo metodo?
  • piega;
  • moltiplicare;
  • dividere;
  • sottrarre;
  • calcolare la radice;
  • elevare a potenza;
  • eleva a potenza la somma degli argomenti divisa per il primo numero + 117;
  • e tutte le altre operazioni che ti vengono in mente.
Cosa non usare:
  • if-else;
  • charcome indicatore di funzionamento;
  • switch-case;
  • e tutto ciò che ti viene in mente.
Cosa puoi usare:
  • Solo lambda, il compito spetta a loro.
- Che cosa? Ed è tutto? - Sì, è tutto, perché devi letteralmente aggiungere 3 righe, se ne suggerisco almeno una, il resto verrà scritto automaticamente. E se vuoi puoi cercare su google esempi e cercare di capire. Certo, ti controllerai e se imbrogli nessuno lo saprà, ma allora perché? Avendo risolto un problema così semplice, tutti i miei 1,5 studenti hanno acquisito una conoscenza approssimativa di cosa sono i lambda e come usarli. Questo sarà molto necessario per lo streaming. Se vuoi vantarti del risultato e scoprire se hai fatto bene, invia il codice in un messaggio privato. Non c'è bisogno di commentare; lì potete aggiungere suggerimenti interessanti (ma in modo tale da non rendere il compito troppo facile). Ancora una volta, dopo aver risolto questo esempio, dovresti già avere una conoscenza approssimativa di come utilizzare i lambda.
Lambda e stream, solo pratica, nessuna teoria - 3
Passiamo ora ai flussi Java. Questi non sono i flussi a cui tu, il lettore, potresti aver pensato. No, non lo è inputStreame non lo è OutputStream. È diverso, è più interessante. I flussi hanno sostituito i cicli, non completamente, ma comunque. Viene servito con il motto “non spiegare come farlo, spiega cosa fare”. Un piccolo esempio di flusso:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
Cosa sta succedendo qui? Aggiungiamo commenti:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Confronta con un ciclo normale:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
Quando leggi il codice, tutto sembra spaventoso, ma è più facile con i commenti? Questo è normale, non li ho capiti neanche io per molto tempo. La chiave per comprendere è la pratica. Iniziamo quindi a leggere articoli di terze parti e cerchiamo risposte alle nostre domande, potete farle anche qui nei commenti, non darò una risposta completa, ma indicherò la direzione. Elenco delle attività di JavaRush che ritengo ottime per esercitarsi nello streaming:
  • 2208 - può essere risolto con 1 flusso e 1 ritorno, ovvero inizierà il corpo del metodo returne poi ci sarà 1 intero flusso. Tralasciamo il requisito StringBuilder.

  • 1908 - puoi anche risolverlo con 1 flusso e 1 ritorno. A partire dalla lettura del file. Non so come registrare su un file tramite stream (se è possibile), per ora lo facciamo manualmente. Quelli. Apriamo solo 2 flussi (console e scrittura su file). Leggiamo il file attraverso metodi che ci restituiranno un foglio o uno stream (google e javadoc).

  • 1907 - in teoria può essere risolto anche in un unico flusso. L'input nel flusso è il nome del file, l'output è il numero di parole mondo.

È tutto. Se posso, scriverò un’altra semplice storia. Secondo me, leggere qualcosa di interessante senza l'opportunità di provarlo è in qualche modo noioso o qualcosa del genere. E dopo la calcolatrice e 3 puzzle, penso che tu stia già andando d'accordo con lambda e flussi, quindi leggi tutte le possibilità se non l'hai già fatto. AGGIORNAMENTO:
  • 1016 - in modo leggermente perverso, puoi risolverlo in 1 flusso e 1 ritorno;

  • 1821 - molto facile e in 1 flusso e 1 ritorno.

    Queste 2 attività ti introdurranno a un altro metodo di streaming e a un altro raccoglitore.

  • 1925: puoi ottenere una riga con parole in un flusso e poi scriverla in un file (non so se sia possibile scrivere su un file da un flusso)

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION