Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Java 8 streams
#1
Posted 08 May 2019 - 06:40
Folositi streamurile din Java 8 ?
Exemplu : sa se concatenze 100 de caractere @, separate intre ele cu virgula si spatiu inainte de java 8 : String s = ""; for (int i =0; i<100;i++){ s += "@" + (i <99 ? ", ":""); } java 8: String s = IntStream.range(0,100).mapToObj(n -> "@").collect(Collectors.joining(", ")); Care varianta ati folosi-o ? Edited by Iulius-Foyas, 08 May 2019 - 06:41. |
#2
Posted 08 May 2019 - 06:54
Java n-are vreo metoda de genul String.Join(array, separator) ?
strict dintre cele 2 optiuni, as alege-o pe prima. e mult mai usor de citit si inteles decat o succesiune de apeluri ale unor metode. |
#3
Posted 08 May 2019 - 07:08
_Smiley_, on 08 mai 2019 - 06:54, said:
Java n-are vreo metoda de genul String.Join(array, separator) ? public static String join(CharSequence delimiter, CharSequence... elements) Streamuri si comparatii: inainte de java 8: String[] arr = {"a","ab","abcdefghij", "abc", "abcdefg"}; String s = ""; for(int i = 0; i < arr.length; i++) { if (arr[i].length() > s.length()) { s = arr[i]; } } java 8: String[] arr = {"a","ab","abcdefghij", "abc", "abcdefg"}; String s = Arrays.asList(arr).stream().max(Comparator.comparing(n->n)).get(); Edited by Iulius-Foyas, 08 May 2019 - 07:12. |
#4
Posted 08 May 2019 - 07:23
Streamurile par cool, dar in esenta lor sint doar un cacat, unfortunately. Si evident ca concatenarea unui string intr-un loop e o prostie. As folosi StringBuilder.
import java.io.IOException; import java.util.stream.Collectors; import java.util.stream.IntStream; public class TestConcat { public static String testString() { String s = ""; for (int i = 0; i <100; ++i) { s += "@" + (i < 99 ? ", " : ""); } return s; } public static String testStream() { return IntStream.range(0,100).mapToObj(n -> "@").collect(Collectors.joining(", ")); } public static String testStringBuilder() { StringBuilder sb = new StringBuilder(); for (int i =0; i < 100; ++i) { sb.append("@").append(i < 99 ? ", " : ""); } return sb.toString(); } public static void main(String[] args) throws IOException { long start = System.nanoTime(); String result = testString(); long diff = System.nanoTime() - start; System.out.println("String Join " + diff); start = System.nanoTime(); result = testStream(); diff = System.nanoTime() - start; System.out.println("Stream Join " + diff); start = System.nanoTime(); result = testStringBuilder(); diff = System.nanoTime() - start; System.out.println("StringBuidler Join " + diff); } } String Join 629333 Stream Join 67414974 StringBuidler Join 17641 |
#5
Posted 08 May 2019 - 08:04
StringBuilder si StringBuffer sunt pentru concatenat stringuri. Streamurile par cool dar lejer pot duce la cod greu de citit..
faster: public static String testStringBuilder() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 99; ++i) { sb.append("@, "); } sb.append("@"); return sb.toString(); } Stie cineva cum functioneaza pana la urma mizeria de formatare cu tagurile code?? Edited by DemocracySucks, 08 May 2019 - 08:32. |
#6
Posted 08 May 2019 - 08:50
eu de obicei folosesc notepad++ ca sa inlocuiesc taburile cu spatii. Un tab = 4 spatii, sau iti poti seta editorul IDE-ului sa-ti inlocuiasca taburile cu spatii
|
#7
Posted 08 May 2019 - 08:51
Am avut si varianta aia (pe care o si prefer), am decis sa n-o includ, ca sa ramin in logica initiala. Operatorul ternar poate de asemenea sa duca la cod greu de citit, pe linga faptul ca faci un test inutil la fiecare iteratie. De exemplu daca vrei sa pui alternativ , si . incepe sa semene cu inscriptii aliene.
public static String testStringBuilderWithIfTwoSeparators() { StringBuilder sb = new StringBuilder(); for (int i =0; i < 100; ++i) { sb.append("@").append(i < 99 ? (i % 2 == 0 ? ", " : ". ") : ""); } return sb.toString(); } |
#8
Posted 08 May 2019 - 08:52
#9
Posted 08 May 2019 - 09:03
Iulius-Foyas, on 08 mai 2019 - 08:50, said:
eu de obicei folosesc notepad++ ca sa inlocuiesc taburile cu spatii. Un tab = 4 spatii, sau iti poti seta editorul IDE-ului sa-ti inlocuiasca taburile cu spatii Iulius-Foyas, on 08 mai 2019 - 08:52, said:
dar ai fost vreodata obligat sa le folosesti ? care ar fi contextul in care ai folosi streamuri si nu metodele clasice echivalente ? Stream-urile au 3 probleme mari: 1. readability care duce la 2. poor maintainability si nu in ultimul rind 3. performance Programarea functionala e in esenta ei un gunoi, io ii spun programare borala. Exista un motiv mare si lat pentru care, desi exista de multa vreme, n-a trecut granitele in lumea reala. Problema este cu hipsterii aia care se cred cul daca scriu un cacat intr-o linie, chiar daca atunci cind crapa si trebuie sa rezolve altul, in loc de linia din cod in care e problema primeste un stack trace de 4 km jumate, plin cu balarii |
#10
Posted 08 May 2019 - 10:33
Iulius-Foyas, on 08 mai 2019 - 06:40, said:
Folositi streamurile din Java 8 ? Da, dar exemplul cu stringuri mi se pare o folosire fortata a streamurilor. Personal prefer streamuri cand e vorba de sortare / filtrare / forEach / anyMatch/allMatch / etc. Elimini mult boilerplate code, salvezi timp. Nici nu mi se pare greu de descifrat ce face un stream; metodele is destul de intuitive. |
|
#11
Posted 08 May 2019 - 11:16
Daca ai intalni un cod clasic care face matching, comparision sau sorting, ai inlocui imediat cu varianta de streamuri() sau in functie de context ai decide daca sa inlocuiesti sau nu ?
|
#12
Posted 08 May 2019 - 18:32
Mosotti, on 08 mai 2019 - 07:23, said:
String Join 629333 Stream Join 67414974 StringBuidler Join 17641 Ca tot vorbim de performanta, benchmark asupra unui cod java fara warmup e fix pix. Cum arata benchmarkul dupa un warmup consistent, folosind OpenJDK 11.0.2: d:\>java TestConcat String Join 11842 Stream Join 10658 StringBuilder Join 15790 Array 5922 d:\>java TestConcat String Join 11053 Stream Join 11052 StringBuilder Join 7500 Array 5921 d:\>java TestConcat String Join 10658 Stream Join 10658 StringBuilder Join 16184 Array 7105 d:\>java TestConcat String Join 10263 Stream Join 11447 StringBuilder Join 8685 Array 5921 Ce vedem? Valori similare. Ciudat ca StringBuilder Join are o oarecare variatie. Dar ce e ultima valoare, avand rezultatul cel mai rapid? Rezolvarea ca-n liceu... Concatenarea a doar 100 valoari nu e nici ea cea mai reprezentativa pentru performanta. Sa marim numarul la 10.000: d:\>java TestConcat String Join 16599568 Stream Join 191054 StringBuilder Join 128290 Array 39474 Edited by dani.user, 08 May 2019 - 18:49. |
#13
Posted 08 May 2019 - 19:14
Iulius-Foyas, on 08 mai 2019 - 07:08, said:
Streamuri si comparatii: inainte de java 8: String[] arr = {"a","ab","abcdefghij", "abc", "abcdefg"}; String s = ""; for(int i = 0; i < arr.length; i++) { if (arr[i].length() > s.length()) { s = arr[i]; } } java 8: String[] arr = {"a","ab","abcdefghij", "abc", "abcdefg"}; String s = Arrays.asList(arr).stream().max(Comparator.comparing(n->n)).get(); In clasicul stil verbose, implementarea stream din java nu e cea mai curata... Acelai cod in scala e infinit mai scurt, si cat se poate de apropiat de limbajul natural: Da-mi cel mai lung sir de caractere din acel array val arr = Array("a", "ab", "abcdefghij", "abc", "abcdefg") val longest : String = arr.maxBy(_.length) Fara transformarea unui array intr-o lista doar pentru acest lucru (wtf). |
#14
Posted 08 May 2019 - 19:57
dani.user, on 08 mai 2019 - 19:14, said:
In clasicul stil verbose, implementarea stream din java nu e cea mai curata... Acelai cod in scala e infinit mai scurt, si cat se poate de apropiat de limbajul natural: Da-mi cel mai lung sir de caractere din acel array val arr = Array("a", "ab", "abcdefghij", "abc", "abcdefg") val longest : String = arr.maxBy(_.length) Fara transformarea unui array intr-o lista doar pentru acest lucru (wtf). Uite cum este codul metodei .maxBy(number); def maxBy[B](f: A => B)(implicit cmp: Ordering[B]): A = { if (isEmpty) throw new UnsupportedOperationException("empty.maxBy") var maxF: B = null.asInstanceOf[B] var maxElem: A = null.asInstanceOf[A] var first = true for (elem <- self) { val fx = f(elem) if (first || cmp.gt(fx, maxF)) { maxElem = elem maxF = fx first = false } } maxElem }E cam codul clasic al celui din java.Sigur ca iti poti face si in java o clasa wrapper caruia sa-i pui o metoda .maxBy(param) daca chiar doreste ca in Scala. Acel "self" din codul de mai sus indica catre o interfata Traversable Collection. Mai exact catre scala.collection.generic.TraversableFactory.scala In Java, lista este un caz particular al unei colectii, mai exact o colectie ordonata. Deci am fii cam tot pe acolo: colectii. Edited by Iulius-Foyas, 08 May 2019 - 19:59. |
#16
Posted 08 May 2019 - 20:01
#17
Posted 08 May 2019 - 20:18
dani.user, on 08 mai 2019 - 19:59, said:
Exercitiu mai avansat decat o simpla concatenare de siruri: Intr-un fisier csv avem date ca cele din poza. Sa se afiseze media pe clasa (9, 10, etc) a celor ce iau premiul 3. elevi.png PS: pune si tu csv-ul ala sa-l trag si eu si care sunt conditiile pt premiul 3 ? Edited by Iulius-Foyas, 08 May 2019 - 20:09. |
#18
Posted 08 May 2019 - 20:46
DemocracySucks, on 08 mai 2019 - 20:01, said:
Ti se intampla frecvent sa te exprimi cu underscore dot something ...? Cand vezi hello_world citesti hello underscore world? Nu... il citesti ca pe un spatiu. DemocracySucks, on 08 mai 2019 - 20:01, said:
Si asta e doar o chestie marunta, scala bate recorduri la cod criptic... Lasa generalizarile, vorbim de cazuri concrete. Iulius-Foyas, on 08 mai 2019 - 20:18, said:
http://commons.apache.org/csv/ sau iti scrii codul propriu in java folosind insa StringBuilderul. Irelevant Iulius-Foyas, on 08 mai 2019 - 20:18, said:
care sunt conditiile pt premiul 3 ? Ca in scoala: ai a 3-a medie din clasa (pot fi mai mult cu aceeasi medie/acelasi premiu intr-o clasa). elevi.zip 5.55K 3 downloads Iulius-Foyas, on 08 mai 2019 - 19:57, said:
E cam codul clasic al celui din java.Sigur ca iti poti face si in java o clasa wrapper caruia sa-i pui o metoda .maxBy(param) daca chiar doreste ca in Scala. Acel "self" din codul de mai sus indica catre o interfata Traversable Collection. Mai exact catre scala.collection.generic.TraversableFactory.scala In Java, lista este un caz particular al unei colectii, mai exact o colectie ordonata. Deci am fii cam tot pe acolo: colectii. S-a vazut mai sus cum arata codul rezultat in java: Arrays.asList(arr).stream() pana sa ma apuc de scris ce vreau defapt. Si apoi prostia de .get() din final. Daca ii cer maximul e clar ca vreau o valoare si doar o valoare. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users