<?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>lambda - Kama Kaczmarek</title>
	<atom:link href="https://kamakaczmarek.net/tag/lambda/feed/" rel="self" type="application/rss+xml" />
	<link>https://kamakaczmarek.net/tag/lambda/</link>
	<description>Strona z materiałami dla uczniów i nauczycieli</description>
	<lastBuildDate>Fri, 10 Apr 2026 07:45:46 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>18. JAVA &#8211; wyrażenia Lambda</title>
		<link>https://kamakaczmarek.net/18-java-wyrazenia-lambda/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 13:38:23 +0000</pubDate>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lambda]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3358</guid>

					<description><![CDATA[<p>Wyrażenia lambda inaczej zwane domknięciami, to fragmenty kodu, które przekazujemy argumentem. Mogą zostać przypisane do zmiennej i przekazywane np. w pracy z listami. Wyrażenia lambda wykorzystujemy z interfejsami funkcyjnymi posiadającymi jedną abstrakcyjną metodę. Interfejs funkcyjny może posiadać tylko jedną metodę abstrakcyjną, ale może posiadać wiele metod default i static. Metody default nie muszą być implementowane [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/18-java-wyrazenia-lambda/">18. JAVA &#8211; wyrażenia Lambda</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>Wyrażenia lambda</strong> inaczej zwane domknięciami, to fragmenty kodu, które przekazujemy argumentem. Mogą zostać przypisane do zmiennej i przekazywane np. w pracy z listami.</p>
<p>Wyrażenia lambda wykorzystujemy z interfejsami funkcyjnymi posiadającymi jedną abstrakcyjną metodę.</p>
<p>Interfejs funkcyjny może posiadać tylko jedną metodę abstrakcyjną, ale może posiadać wiele metod default i static. Metody default nie muszą być implementowane przez klasy korzystające z interfejsu (przydaje się to gdy już istniejący interfejs należy rozszerzyć).<br />Jeżeli w kodzie natrafimy na znak &#8222;-&gt;&#8221; oznacza on właśnie wykorzystanie lambdy.</p>
<p> </p>
<p>Przykład:</p>
<pre>import java.util.ArrayList;<br />import java.util.Arrays;<br />import java.util.function.Predicate;<br /><br />//tworzymy interfejs funkcyjny do mnożenia 2 intów<br />interface Multiplication{<br />    int multi(int x, int y);<br />}<br /><br />//interfejs z metodą generyczną dzielenia<br />interface Division&lt;T&gt;{<br />    T div(T x, T y);<br />}<br /><br />//krok4 - dodamy ogólny szablon dla działań matematycznych z typem generycznym<br />//będzie zracany wynik jakiegoś typu z metody, która będzie posiadała 2 parametry<br />//dzięki temu nie musimy definiować wielu interfejsów jw.<br />interface Operations&lt;T&gt;{<br />    T operate(T x, T y);<br />}<br /><br />public class Lambda {<br /><br />    //krok3 - przekazujemy wyrażenie lambda jako argument metody<br />    public void lambda(Multiplication multi){<br />        System.out.println("Wynik z metody pobierającej lambdę " + multi.multi(10,10));<br />    }<br /><br />    public static void main(String[] args) {<br />        //krok1 - wykorzystujemy wyrażenie lambda<br />        Multiplication multi = (int x, int y) -&gt; x * y;<br />        System.out.println("Mnożenie wynosi " + multi.multi(2,3));<br /><br />        //krok2 - wykorzystujemy interfejs generyczny<br />        Division&lt;Float&gt; div = (Float x, Float y) -&gt; {//użyjemy nawiasów klamrowych dla bloku kodu<br />            float d = x/y;<br />            return d;<br />        };//dajemy średnik, bo to koniec linijki kodu!<br />        float d = div.div(10f,2f);<br />        System.out.println("Dzielenie wynosi " + d);<br /><br />        //cd krok3 - wykorzystamy metodę<br />        Lambda lambdaExampleWithMethod = new Lambda();<br />        lambdaExampleWithMethod.lambda(multi);<br />        lambdaExampleWithMethod.lambda( (x,y) -&gt; (x+2) * y );//modyfikujemy dane, nie podaję typów, bo Java sama się domyśli<br /><br />        //krok4 - wykorzystujemy szablon ogólny Operations<br />        Operations&lt;/*typ w zależności od potrzeb*/Integer&gt; add = /*podpinamy teraz wyrażenie lambda*/ (x,y)-&gt;x+y;<br />        System.out.println("Metoda lambda z dodawaniem " + add.operate(5,6));<br /><br />        Operations&lt;Integer&gt; multipl = (x,y)-&gt;x*y;<br />        System.out.println("Metoda lambda z mnożeniem " + add.operate(5,6));<br /><br />        //wykorzystajmy wyrażenie lambda do sortowania elementów w tablicy ze względu na długość<br />        String[] arr = {"Python", "Java", "PHP", "C++", "HTML+CSS"};<br />        //korzystamy z metody sort dla Arrays<br />        Arrays.sort(arr, /*tworzymy wyrażenie lambda*/(x,y)-&gt;{return x.length() - y.length();});<br />        for (String a : arr) {<br />            System.out.println(a);<br />        }<br /><br />        //wyrażenie lambda może korzystać z wbudowanych interfejsów funkcyjnych z pakietu java.util.functions<br />        //np. Predicate, żeby usunąć element z listy<br /><br />        //tworzymy nową listę<br />        ArrayList&lt;String&gt; al = new ArrayList&lt;&gt;();<br />        al.add("PHP");<br />        al.add("Python");<br />        al.add(null);<br />        al.add("Java");<br />        al.add("C++");<br />        al.add("Pascal");<br />        al.add(null);<br /><br />        //skorzystamy z metody removeIf<br />        //dodajmy na górze import pakietu functions<br />        //usuń element jeżeli x jest równe null lub jest równe "Pascal"<br />        al.removeIf( x -&gt; x == null || x.equalsIgnoreCase("Pascal"));<br />        System.out.println(al); //otrzymujemy oczyszczoną listę<br /><br /><br />    }<br />}</pre>
<p> </p>
<p>Przykład: Wyrażenie lambda i default</p>
<pre><br />@FunctionalInterface<br />interface Operators{<br />    int operate(int x, int y);<br /><br />    default int add(int x, int y){<br />        System.out.println("Metoda add z interfejsu");<br />        return x+y;<br />    }<br />    default int subtract(int x, int y){<br />        System.out.println("Metoda subtract z intefejsu");<br />        return x-y;<br />    }<br />    default int multi(int x, int y){<br />        System.out.println("Metoda multi z intefejsu");<br />        return x*y;<br />    }<br />    static int divide(int x, int y){<br />        System.out.println("Metoda divide z intefejsu");<br />        return x/y;<br />    }<br />}<br /><br />//tworzymy klasę implementującą nasz interfejs<br />class OperatorsClass implements Operators{<br /><br />    //przesłaniamy metody abstrakcyjne<br /><br />    @Override<br />    public int multi(int x, int y) {<br />        System.out.println("OperatorsClass.multi()");<br />        return x*y;<br />    }<br /><br />    @Override<br />    public int operate(int x, int y) {<br />        System.out.println("OperatorsClass.operate()");<br />        return x+y;<br />    }<br /><br />    //możemy wykorzystać domyślną implementację metody wewnątrz interfejsu<br /><br />    @Override<br />    public int add(int x, int y) {<br />        //wywołamy metodę domyślną interfejsu<br />        System.out.println("OperatorsClass.add()");<br />        return Operators.super.add(x,y);<br />    }<br />}<br /><br />public class LambdaAndDefaultMethods {<br />    public static void main(String[] args) {<br />        Operators math = (int x, int y) -&gt; x * y;<br />        System.out.println(math.operate(5,2));<br /><br />        System.out.println(Operators.divide(55,11));<br /><br />        System.out.println(math.multi(5,2));<br /><br />        OperatorsClass operatorsClass = new OperatorsClass();<br />        System.out.println(operatorsClass.operate(12,2));<br />        System.out.println(operatorsClass.multi(2,2));<br />        System.out.println(operatorsClass.subtract(20,10));<br />        System.out.println(operatorsClass.add(20,10));<br />    }<br />}</pre>
<p> </p>
<h2>Referencja do metody</h2>
<p>Z wyrażeniem lambda związane jest pojęcie referencji do metody.<br />Oznacza to, że możemy się odwołać do metody bez jej wywołania, potrzebuje jednak interfejsu funkcyjnego, gdyż referencja do metody tworzy instancję tegoż interfejsu.</p>
<p><br />Konstrukcja to: nazwaklasy::nazwametody.<br /><br />Wykorzystamy referencję lambda do wyświetlenia hashu danego obiektu:</p>
<pre>import java.util.function.IntSupplier;<br /><br />public class LambdaReferenceToMethods {<br /><br />    //stworzymy własną metodę wykorzystującą ntSupplier<br />    public void myFunction(IntSupplier intSupplier){<br />        System.out.println(intSupplier.getAsInt());<br />    }<br /><br />    public static void main(String[] args) {<br />        Object obj = new Object();<br />        //wywołujemy interfejs funkcyjny zwracający int bezargumentowo - IntSupploer<br />        //jeżeli po obj damy kropkę zobaczymy listę dostępnych metod, ale my chcemy dostać się do metody poprzez referencję czyli wykorzystamy ::<br />        IntSupplier intSupplier = obj::hashCode;<br /><br />        //wywołujemy metodę interfejsu funkcyjnego<br />        System.out.println(intSupplier.getAsInt());<br /><br />        //tworzymy nową instancję z wykorzystaniem własnej metody<br />        //otrzymamy ten sam wynik jw<br />        LambdaReferenceToMethods lr = new LambdaReferenceToMethods();<br />        lr.myFunction(intSupplier);<br /><br />    }<br />}</pre>
<p> </p>
<h2>Lambda i Timer</h2>
<p>Przykład wykorzystania lambdy wraz z klasą Timer do wyświetlania w okienku (klasa JFrame) aktualnego czasu co 1s.</p>
<pre>import javax.swing.*;<br />import java.util.Date;<br /><br />public class LambdaAndTimer extends JFrame {<br />    public static void main(String[] args) {<br />        //tworzymy okienko<br />        LambdaAndTimer lat = new LambdaAndTimer();<br />        lat.setTitle("Timer");//ustawiamy tytuł<br />        lat.setSize(300,100);//ustawiamy rozmiar okna<br />        lat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ustalamy co się stanie po naciśnięciu przycisku zamknięcia<br /><br />        //miejsce gdzie będzie wyświetlany tekst w pojedynczej linijce<br />        JLabel lbl = new JLabel();<br />        lat.add(lbl);//dodajemy label do timera<br /><br />        //wyświetlamy<br />        lat.setVisible(true);<br /><br />        //tworzymy timer - ustawiamy czas na 1s(1000ms) i przekazujemy lambdę<br />        Timer timer = new Timer(1000, event -&gt;{//aktualizujemy co 1s lbl i terminal<br />            Date date = new Date(); //pobieramy aktualną datę<br />            System.out.println(date.toString()); //wyświetlamy w terminalu<br />            lbl.setText(date.toString()); //wyświetlamy w label<br />        });<br />        //startujemy odliczanie<br />        timer.start();<br /><br /><br />    }<br />}</pre>
<p> </p>
<p> </p>
<p>Artykuł <a href="https://kamakaczmarek.net/18-java-wyrazenia-lambda/">18. JAVA &#8211; wyrażenia Lambda</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
