Content Index
Astăzi vă aduc acest blog o intrare despre Java Îmbunătățiri 8. Trebuie să mărturisesc că, deși la început arăta ca o galerie autentică, cu cursul orelor și, mai presus de toate, cu practica noilor structuri, am fost convingătoare că într-adevăr codul este mult mai lizibil , confortabil de implementat și cel mai important: eficient.
Ei bine, este adevărat că am un timp minunat să încerc, să învăț și să mă construim, dar există structuri și moduri de lucru care mi-au făcut viața.
Deci, poate la fel, vă puteți servi și dumneavoastră.
Stream, cu voi toți ați început în Java 8!
Spre deosebire de predecesorul dvs., Java 7, cea mai recentă versiune (Java 8) a adăugat la interfața de colectare (din pachetul Java.til) metoda fluxului.
DIV id = „843A0C4F79 „>
ceea ce este stream? Ei bine, nu mai mult sau mai puțin decât o secvență de elemente. Cu această metodă putem transforma o colecție de obiecte (matrice, liste, …) într-o succesiune de obiecte.
Vom înregistra modul în care această metodă a fost utilizată pentru clasele arrailiste sau pentru matrice:
Interfața listă moștenește din colecție, astfel încât, de asemenea, veți putea utiliza metoda de flux astfel încât este ușor să deduceți următoarele:
List listaCadenas = new ArrayList(); //Notación diamanteList listaCadenas = new ArrayList(); listaCadenas.add("Juan"); listaCadenas.add("Antonio"); listaCadenas.add("Maria"); Stream streamCadenas = listaCadenas.stream();En el caso de Arrays también podemos usar el método: public static Stream stream(T array) { return stream(array, 0, array.length); }Integer enteros = {1,2,3,4,5,6}; Stream enterosStream = Arrays.stream(enteros);Además del método stream Java 8 incluye otro método muy en la línea: parallelStream. Para más información: https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#stream--
perfect, dar și cu ceea ce facem? Shhh, liniște … dorm un pas, moale moale … Ahem 😉 Continuăm.
Hartă, Aliatul dvs.
Deși interfața fluxului oferă mai multe metode, vom începe prin aceasta: hartă.
în timp ce în următoarele intrări nu vom pleca în uitare: filtru, plat și reducere.
De câte ori am călătorit o structură în care verificarea unei condiții pe care am făcut o acțiune sau o altă linie pentru câte linii de cod? Câți pentru / dacă / altcineva a fost imbricat din ce Sonar sa plâns (și am trecut câteva săptămâni când am uitat ce a făcut acest fragment de cod)?
bine în Java 8 ni se permite să facem același lucru o linie.
ca înainte de primul lucru este să vă prezint metoda:
/** * Returns a stream consisting of the results of applying the given * function to the elements of this stream. * *This is an intermediate * operation. * * @param The element type of the new stream * @param mapper a non-interfering, * stateless * function to apply to each element * @return the new stream */ Stream map(Function mapper);
hartă va aplica o funcție pe care o numim f plicuri fiecare dintre elementele succesiunii și va returna o altă succesiune a elementelor deja modificate.
și acea funcție este …?
Oricine trebuie să se aplice, că da îndeplinește unele Restricții.
De exemplu, putem spune că vrem să facem un ornament () la fiecare element al succesiunii de tip șir de succesiune a primului element. Pentru aceasta putem să o scriem așa în Java 8:
streamCadenas.map(s->s.trim());
Așa am început să o folosesc și cu ea încă nu mai fac singura.
În această opțiune folosim o variabilă, a cărei domeniu de aplicare este cel al metodei (în afara acestei hartă nu va exista și nu va fi necesar să se declare anterior).
Indicăm că fiecare element al acestei succesiuni, O vom salva într-o variabilă S, de același tip de element și vom aplica funcția Trim ().
De ce nu am pune coard S- > s .trim ()? Deoarece Java recunoaște perfect tipul de variabile, știind tipul de elemente ale succesiunii (flux). Dacă am fi folosit fluxul enterarosstream, ar fi tipul întreg și nu ar fi necesar să o declarăm.
O altă modalitate de a face același lucru ar fi următoarele:
streamCadenas.map(String :: trim).
Diferența cu cea anterioară este că am salvat variabila, această nomenclatură nu este întotdeauna validă. Trebuie să ne asigurăm că metoda nu are parametri, dacă le-ați fi avut, nu a putut fi folosită în acest fel, deși se află în filtrul dvs.
sau cum să salvați câteva bucle
/** * Returns a stream consisting of the elements of this stream that match * the given predicate. * *This is an intermediate * operation. * * @param predicate a non-interfering, * stateless * predicate to apply to each element to determine if it * should be included * @return the new stream */ Stream filter(Predicate predicate);
Ca și în API în sine este indicat, filtrul primește o succesiune de elemente și returnează pe cei care respectă modelul căutat (predicat).
Am început să arătăm un exemplu de bază.
Avem o listă de lanțuri în care păstrăm tipurile de vehicule și le vom obține pe cei care nu sunt „motociclete”
iv id = „5e6bf6201c”
cu Java 8 ar fi cum ar fi:
List filteredVehicles = vehicles.stream() .filter(v -> !"motorbike".equals(v)) .collect(Collectors.toList());
În cazul nostru, deja pentru un proiect, am avut o listă de profil numită profiluri unde Am avut cazuri de diferite tipuri: individual, corporativ, … am vrut ca lista pentru a obține trei. Unul pentru fiecare tip de profil al celor care au constat în aplicație.
La început am recurs la pentru / dacă în care am iterat lista de profile și în dacă am specificat condiția care trebuie îndeplinită. Deoarece au existat mai multe liste pe care le-am dorit ca o ieșire a fost necesară pentru a fi folosită dacă / altceva. În cele din urmă am primit mult mai curat cu această metodă Java 8. sub exemplul uneia dintre listele obținute.
În acest caz, lucrul important este de a vedea un alt tip de structură în care predicatul filtrului este o altă metodă: estetype, o metodă proprie.
List individuales = profiles.stream().filter(s -> isType(s, EnumTypeCertificate.INDIVIDUAL.name())).collect(Collectors.toList());private boolean isType(Profile profile,String typeProfile) { return profile.getType().equals(typeProfile); }flatMap, magia!/** * Returns a stream consisting of the results of replacing each element of * this stream with the contents of a mapped stream produced by applying * the provided mapping function to each element. Each mapped stream is * {@link java.util.stream.BaseStream#close() closed} after its contents * have been placed into this stream. (If a mapped stream is {@code null} * an empty stream is used, instead.) * *This is an intermediate * operation. * * @apiNote * The {@code flatMap()} operation has the effect of applying a one-to-many * transformation to the elements of the stream, and then flattening the * resulting elements into a new stream. * *Examples. * *If {@code orders} is a stream of purchase orders, and each purchase * order contains a collection of line items, then the following produces a * stream containing all the line items in all the orders: *{@code * orders.flatMap(order -> order.getLineItems().stream())... * }* *If {@code path} is the path to a file, then the following produces a * stream of the {@code words} contained in that file: *{@code * Stream lines = Files.lines(path, StandardCharsets.UTF_8); * Stream words = lines.flatMap(line -> Stream.of(line.split(" +"))); * }* The {@code mapper} function passed to {@code flatMap} splits a line, * using a simple regular expression, into an array of words, and then * creates a stream of words from that array. * * @param The element type of the new stream * @param mapper a non-interfering, * stateless * function to apply to each element which produces a stream * of new values * @return the new stream */ Stream flatMap(Function<? super T, ? extends Stream> mapper);
În exemplul pe care îl vedem mai jos am avut următoarea problemă. Fiecare element de profil a avut un câmp de lanț de tip token care conține valori separate prin virgulă.
am vrut să obținem fiecare dintre aceste elemente și să le adăugăm într-o listă, dar fără articole repetate.
pentru acest lucru cu lista de obiecte de profil transformammo într-o succesiune de elemente la care a fost aplicată pentru tokenul său variabil metoda divizată.
Imaginați-vă că avem ceva de genul ăsta
public class Profile { String token; ... //Getters and Setters ... }
câmpul de jetoane are o valoare ca aceasta = > token = „browser, pkcs12, jks”; acum îmi imaginez că avem două obiecte de profil pe care le-am avea ceva de genul acesta:
Lista de Profile Profile = > token = "BROWSER,PKCS12,JKS,USER_GENERATED,JKS,SOFT" ...
ceea ce intenționăm să obținem este:
Lista de String "BROWSER" "PKCS12" "JKS" "USER_GENERATED" "SOFT"
Și chiar mai mult, nu am vrut în realitate lista, am vrut să ne întoarcem false sau adevărate în funcție de faptul dacă profilul conține oricare dintre jetoane, astfel încât acesta să fie afișat pe ecran.
DIV ID = „269C5F4750” >
Pentru a termina sistemul de operare Lăsăm capitolul 1, descărcare gratuită, de la Doc Java 8: (Click aici)
Acest post a fost modificat pe 19 ianuarie 2021 13:07