<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>stream - Kama Kaczmarek</title>
	<atom:link href="https://kamakaczmarek.net/tag/stream/feed/" rel="self" type="application/rss+xml" />
	<link>https://kamakaczmarek.net/tag/stream/</link>
	<description>Strona z materiałami dla uczniów i nauczycieli</description>
	<lastBuildDate>Fri, 10 Apr 2026 07:45:41 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>19. JAVA &#8211; strumieniowanie</title>
		<link>https://kamakaczmarek.net/19-java-strumieniowanie/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 13:52:21 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[stream]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3366</guid>

					<description><![CDATA[<p>Strumieniowanie pozwala na iterowanie i manipulowanie elementami list i kolekcji z użyciem wyrażenia lambda. Stream jest interfejsem generycznym,  doskonałą alternatywą dla przeglądania list przy pomocy pętli i przede wszystkim jest szybsza. Pozwala też na równoległe wykonywanie operacji na danych. Przykład: plik Products.java public class Products { public String name; public int price; public Products(String name, [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/19-java-strumieniowanie/">19. JAVA &#8211; strumieniowanie</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Strumieniowanie pozwala na iterowanie i manipulowanie elementami list i kolekcji z użyciem wyrażenia lambda.</p>
<p><br /><strong>Stream</strong> jest interfejsem generycznym,  doskonałą alternatywą dla przeglądania list przy pomocy pętli i przede wszystkim jest szybsza. Pozwala też na równoległe wykonywanie operacji na danych.</p>
<p>Przykład:</p>
<p><strong>plik Products.java</strong></p>
<pre>public class Products {<br />    public String name;<br />    public int price;<br /><br />    public Products(String name, int price) {<br />        this.name = name;<br />        this.price = price;<br />    }<br /><br />    public String getName() {<br />        return name;<br />    }<br /><br />    public void setName(String name) {<br />        this.name = name;<br />    }<br /><br />    public int getPrice() {<br />        return price;<br />    }<br /><br />    public void setPrice(int price) {<br />        this.price = price;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Products{" +<br />                "name='" + name + '\'' +<br />                ", price=" + price +<br />                '}';<br />    }<br />}</pre>
<p><strong>plik Car.java</strong></p>
<pre>import java.util.Comparator;<br />import java.util.Objects;<br /><br />// w klasie musimy użyć Comparatoor do porównywania elementów, aby skutecznie stosować collect<br />public class Car implements Comparator&lt;Car&gt; {<br />    public String name;<br />    public int topSpeed;<br />    public int price;<br /><br />    public Car(String name, int topSpeed, int price) {<br />        this.name = name;<br />        this.topSpeed = topSpeed;<br />        this.price = price;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "Car{" +<br />                "name='" + name + '\'' +<br />                ", topSpeed=" + topSpeed +<br />                ", price=" + price +<br />                '}';<br />    }<br /><br />    //dodajemy equals and hashcode<br />    //wybieramy z listy tylko name<br />    @Override<br />    public boolean equals(Object o) {<br />        if (this == o) return true;<br />        if (o == null || getClass() != o.getClass()) return false;<br />        Car car = (Car) o;<br />        return name.equals(car.name);<br />    }<br /><br />    @Override<br />    public int hashCode() {<br />        return Objects.hash(name);<br />    }<br /><br />    //implementujemy metodę compare<br />    //modyfikujemy zwracanie<br />    @Override<br />    public int compare(Car o1, Car o2) {<br />        return o1.name.compareTo(o2.name);<br />    }<br />}</pre>
<p> </p>
<p><strong>plik StreamExample.java</strong></p>
<pre>import java.util.*;<br />import java.util.stream.Collectors;<br />import java.util.stream.Stream;<br /><br />public class StreamExample {<br />    public static void main(String[] args) {<br />        //tworzymy zbiór, który następnie przefiltrujemy<br />        ArrayList&lt;String&gt; arl = new ArrayList&lt;&gt;();<br />        arl.add("PHP");<br />        arl.add("Python");<br />        arl.add("C++");<br />        arl.add("Java");<br />        arl.add("JS");<br />        arl.add("HTML");<br />        arl.add("CSS");<br /><br /><br />        //aby iterować po elementach użyjemy strumieniowania zamiast pętli<br />        //chcemy otrzymać listę elementów, których liczba znaków =3<br />        arl.stream().filter(someValue -&gt; someValue.length()&gt;=3 &amp;&amp; someValue.length()&lt;=6)//nie dajemy średnika, bo po kropce damy kolejne metody<br />                    //możemy dodatkowo przefiltrować ze względu na literę od jakiej sie zaczybnna nazwa<br />                    .filter(someValue -&gt; someValue.startsWith("P") || someValue.startsWith("C"))<br />                    //iterujemy po elementach po przefiltrowaniu<br />                    .forEach(someValue -&gt; System.out.println(someValue));<br /><br />        //tworzymy listę na bazie klasy<br />        ArrayList&lt;StreamMyClass&gt; animals = new ArrayList&lt;&gt;();<br />        animals.add( new StreamMyClass("Elephant", 4000, 2));<br />        animals.add( new StreamMyClass("Python", 150, 5));<br />        animals.add( new StreamMyClass("ShiTzu", 7, 0));<br />        animals.add( new StreamMyClass("Wasp", 0, 7));<br />        animals.add( new StreamMyClass("Wife", 75, 10));<br /><br />        //filtrujemy elementy własnej klasy po poziomie agresji<br />        animals.stream().filter(myName -&gt; myName.agrresive&gt;6)<br />                        .filter(myName -&gt;  myName.weight&gt;50 &amp;&amp; myName.weight&lt;100)<br />                        .forEach(myValue -&gt; System.out.println(myValue));<br /><br />        //otrzymane wyniki możemy dodać do innej kolekcji<br />        //służy do tego metoda collect()<br /><br />        //tworzymy listę z wyników filtrowania<br />        List&lt;StreamMyClass&gt; list = animals.stream().filter(sth -&gt; sth.agrresive&gt;6)<br />                .collect(Collectors.toList());<br /><br />        //teraz chcemy z wyników zrobić ArrayList<br />        ArrayList&lt;StreamMyClass&gt; arrl = new ArrayList&lt;&gt;(list);<br />        arrl.forEach(sth -&gt; System.out.println(sth));<br /><br />        //aby dodać do kolekcji tylko unikalne elementy użuwamy Set()<br />        //przykład1<br />        List&lt;Integer&gt; arr = Arrays.asList(8,-2,6,7,5,4,2,8,3,3,7,10,-11,2);<br />        Set&lt;Integer&gt; uniqueNumbers = arr.stream().collect(Collectors.toSet());<br />        System.out.println(uniqueNumbers);<br /><br />        //przykład2<br />        ArrayList&lt;String&gt; arl1 = new ArrayList&lt;&gt;();<br />        arl1.add("PHP");<br />        arl1.add("PHP");<br />        arl1.add("Python");<br />        arl1.add("C++");<br />        arl1.add("C++");<br />        arl1.add("Java");<br />        arl1.add("JS");<br />        arl1.add("JS");<br />        arl1.add("HTML");<br />        arl1.add("CSS");<br />        Set&lt;String&gt; set = arl1.stream().filter(someValue -&gt; someValue.length()&gt;=3 &amp;&amp; someValue.length()&lt;=6)<br />                .filter(someValue -&gt; someValue.startsWith("P") || someValue.startsWith("C"))<br />                .collect(Collectors.toSet());<br />        set.forEach(someValue-&gt; System.out.println(someValue));<br /><br />        //przykład z użyciem klasy Car<br />        ArrayList&lt;Car&gt; cars = new ArrayList&lt;&gt;();<br />        //dodajmy elementy, które będą zduplikowane<br />        cars.add(new Car("Peugeot", 270, 150000));<br />        cars.add(new Car("Ford", 250, 170000));<br />        cars.add(new Car("Peugeot", 270, 150000));<br />        cars.add(new Car("Mercedes", 240,200000));<br />        cars.add(new Car("Mercedes", 240,200000));<br />        cars.add(new Car("MBW", 280,260000));<br />        cars.add(new Car("Opel", 220, 140000));<br />        //użyjemy teraz collect() do wyciągnięcia unikalnych danych<br />        Set&lt;Car&gt; set1 = cars.stream().filter(car -&gt; car.price&lt;260000)<br />                .collect(Collectors.toSet());<br />        set1.forEach(car -&gt; System.out.println(car));<br /><br />        //sumowanie elementów za pomoca summingToInt na bazie klasy Products<br />        ArrayList&lt;Products&gt; product = new ArrayList&lt;Products&gt;();<br />        //dodajmy elementy<br />        product.add(new Products("apple", 3));<br />        product.add(new Products("banana", 4));<br />        product.add(new Products("pineaple", 4));<br />        product.add(new Products("bag", 1));<br />        product.add(new Products("perfume", 12));<br />        int totalPrice = product.stream()<br />                .collect(Collectors.summingInt(element -&gt; element.price));<br />        System.out.println(totalPrice);<br /><br />        //sumowanie elementów można teżprzeprowadzić za pomocą reduce()<br />        //skorzystamy z istniejącej listy arr<br />        int resultSum = arr.stream()<br />                //reduce(wartość starowa, (lambda z 2 argumentami: suma dotychczasowa i następny element)<br />                .reduce(0, (tempsum, el) -&gt; tempsum+el);<br />        System.out.println("wynik sumowania reduce() " + resultSum);<br /><br />        //sumowanie z referencją do metody<br />        int resultSumRef = arr.stream()<br />                .reduce(0, Integer::sum);<br />        System.out.println("Wynik sumowania redice() z referencją: " + resultSumRef);<br /><br />        //zmapujmy teraz naszą listę po name<br />        Map&lt;String, Products&gt; producsMap = product.stream()<br />                .collect(Collectors.toMap(el-&gt;el.name, el-&gt;el));<br />        System.out.println(producsMap);<br />        //odwołajmy sie do konkretnego elementu mapy<br />        Products pr = producsMap.get("apple");<br />        System.out.println(pr);<br /><br />        //referencja do metody<br />        List&lt;Integer&gt; producsPrices = product.stream()<br />                .filter(el-&gt;el.price&lt;10)<br />                .map(Products::getPrice).collect(Collectors.toList());<br />        System.out.println(producsPrices);<br /><br />        //kolekcję możemy przeszukać pod kątem największem i najmniejszej wartości<br />        //max()<br />        Products prodMaxPrices = product.stream().max((pr1, pr2) -&gt; pr1.price&gt;pr2.price ? 1 : -1)<br />                .get();<br />        System.out.println(prodMaxPrices);<br />        //min()<br />        Products prodMinPrices = product.stream().min((pr1, pr2) -&gt; pr1.price&gt;pr2.price ? 1 : -1)<br />                .get();<br />        System.out.println(prodMinPrices);<br /><br />        //ograniczmy listę zwracanych wyników, wykorzystamy istniejącą litę arr<br />        List&lt;Integer&gt; result = arr.stream()<br />                .filter(el-&gt; el &gt; 0 &amp;&amp; el &lt;10)<br />                .limit(6)<br />                .collect(Collectors.toList());<br />        System.out.println(result);<br /><br />        //aby zliczyc ilość elementów używamy count()<br />        System.out.println(result.stream().count());<br /><br />        //jeżeli potrzebujemy stworzyć stream wypełniony wartościami, możemy zrobić to dwojako<br />        //z użyciem limit<br />        System.out.println("Stream z limitowaniem");<br />        Stream.iterate(0, i -&gt; i+1).limit(10)<br />                .forEach(stream -&gt; System.out.print(stream));<br />        //bez limit<br />        System.out.println("\nStream bez limitowania");<br />        Stream.iterate(0, i -&gt; i&lt;10, i -&gt; i+1)<br />                .forEach(stream -&gt; System.out.print(stream));<br /><br />    }<br />}</pre>
<p><strong>plik StreamMyClass.java</strong></p>
<pre>//filtrowanie własnej klasy<br />//stwórzmy klasę dla klasyfikacji zwierząt pod kątem wagi i agresji<br />public class StreamMyClass {<br />    public String name;<br />    public int weight;<br />    public int agrresive; //1-10<br /><br />    public StreamMyClass(String name, int weight, int agrresive) {<br />        this.name = name;<br />        this.weight = weight;<br />        this.agrresive = agrresive;<br />    }<br /><br />    @Override<br />    public String toString() {<br />        return "StreamMyClass{" +<br />                "name='" + name + '\'' +<br />                ", weight=" + weight +<br />                ", agrresive=" + agrresive +<br />                '}';<br />    }<br />}</pre>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/19-java-strumieniowanie/">19. JAVA &#8211; strumieniowanie</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
