Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 Kanal D va difuza serialul “...

Upgrade xiaomi mi11

securitate - acum se dau drept - ...

Farmacia Dr Max - Pareri / Sugest...
 

Java 8 streams

- - - - -
  • Please log in to reply
81 replies to this topic

#1
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019
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
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,032
  • Înscris: 24.02.2006
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
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019

View Post_Smiley_, on 08 mai 2019 - 06:54, said:

Java n-are vreo metoda de genul String.Join(array, separator) ?
Are cu proto:
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
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
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
DemocracySucks

DemocracySucks

    Junior Member

  • Grup: Members
  • Posts: 227
  • Înscris: 06.04.2019
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
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019
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
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
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
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019

View PostMosotti, on 08 mai 2019 - 07:23, said:

Streamurile par cool, dar in esenta lor sint doar un cacat, unfortunately.
dar ai fost vreodata obligat sa le folosesti ?
care ar fi contextul in care ai folosi streamuri si nu metodele clasice echivalente ?

Edited by Iulius-Foyas, 08 May 2019 - 08:54.


#9
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004

View PostIulius-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
Orice editor se poate seta, din pacate fiecare editor include optiunea in cele mai nastrusnice locuri. Daca fereastra de setari are optiune de cautare se mai simplifica lucrurile, daca nu probabil gugal e mult mai rapid decit sa cauti dupa ea...

View PostIulius-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 ?
N-am fost niciodata obligat si nu am cum sa fiu obligat, pentru ca nu fac nimic in plus sau mai bine, fac doar mai condensat. Folosesc stream-uri doar daca vreau sa fac ceva rapid de care stiu ca nu-mi va mai pasa miine sau care nu trebuie sa fie descifrat de altii peste enspe ani.

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 :first:

#10
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013

View PostIulius-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
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007

View PostMosotti, 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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007

View PostIulius-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
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019

View Postdani.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).
Stiu de Scala si in  general este cam "syntactic sugar" pt java.
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.


#15
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
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.

Attached File  elevi.png   5.41K   14 downloads

#16
DemocracySucks

DemocracySucks

    Junior Member

  • Grup: Members
  • Posts: 227
  • Înscris: 06.04.2019

View Postdani.user, on 08 mai 2019 - 19:14, said:

si cat se poate de apropiat de limbajul natural:
val longest : String = arr.maxBy(_.length)
Ti se intampla frecvent sa te exprimi cu underscore dot something ...? Si asta e doar o chestie marunta, scala bate recorduri la cod criptic...

#17
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019

View Postdani.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.

Attachment elevi.png
http://commons.apache.org/csv/ sau iti scrii codul propriu in java folosind insa StringBuilderul.

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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007

View PostDemocracySucks, 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.

View PostDemocracySucks, 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.

View PostIulius-Foyas, on 08 mai 2019 - 20:18, said:

http://commons.apache.org/csv/ sau iti scrii codul propriu in java folosind insa StringBuilderul.

Irelevant

View PostIulius-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).

Attached File  elevi.zip   5.55K   3 downloads

View PostIulius-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

Second Opinion 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate