Difference between revisions of "Java-mis"

From berki WIKI
Jump to: navigation, search
(Created page with " ==List-forEach()== <source lang="java"> List<String> items = new ArrayList<>(); items.add("A"); items.add("B"); items.add("C"); items.add("D"); items.add("E"); //lam...")
 
(List-forEach())
Line 2: Line 2:
  
 
==List-forEach()==
 
==List-forEach()==
 
+
<br>
 
<source lang="java">
 
<source lang="java">
 
List<String> items = new ArrayList<>();
 
List<String> items = new ArrayList<>();
Line 15: Line 15:
 
items.forEach(item->System.out.println(item));
 
items.forEach(item->System.out.println(item));
 
</source>
 
</source>
 
+
<br>
 
Ez miért működik?  
 
Ez miért működik?  
<br>
+
<br><br>
 
A List a java.lang.Iterale osztály leszármazottja. Ebben van egy default metódus implementáció a forEach-re.  
 
A List a java.lang.Iterale osztály leszármazottja. Ebben van egy default metódus implementáció a forEach-re.  
 
<source lang="java">
 
<source lang="java">
Line 46: Line 46:
 
* Az interfésznek pontosan 1 darab absztrakt metódusa van (vagyis implementálandó)  
 
* Az interfésznek pontosan 1 darab absztrakt metódusa van (vagyis implementálandó)  
 
}}
 
}}
<br>
+
<br><br>
  
 
Az alábbi Lambda kifejezéssel inline implementációt készítettünk a funkcionális interfészhez, ami egy Lista elem típusú paramétert vár és void a visszatérési értéke.  
 
Az alábbi Lambda kifejezéssel inline implementációt készítettünk a funkcionális interfészhez, ami egy Lista elem típusú paramétert vár és void a visszatérési értéke.  
Line 52: Line 52:
 
items.forEach(item->System.out.println(item));
 
items.forEach(item->System.out.println(item));
 
</source>
 
</source>
 +
<br>
 +
<br>
 +
 +
A Lambda kifejezést kicserélhetjük method reference-re is:
 +
<source lang="java">
 +
items.forEach(System.out::print);
 +
</source>
 +
Ez egy statikus metódus referencia, amivel azt mondjuk meg, hogy a Consumer implementációja a System.out.print(T) metódust fogja meghívni. A lényeg, hogy egy argumentumos legyen a megadott metódus és fel tudjon dolgozni T lista típusú elemet.

Revision as of 13:05, 3 November 2019


List-forEach()


List<String> items = new ArrayList<>();
	items.add("A");
	items.add("B");
	items.add("C");
	items.add("D");
	items.add("E");

	//lambda
	//Output : A,B,C,D,E
	items.forEach(item->System.out.println(item));


Ez miért működik?

A List a java.lang.Iterale osztály leszármazottja. Ebben van egy default metódus implementáció a forEach-re.

package java.lang;

public interface Iterable<T> {
...
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
...

Ez a Consumer<? super T> generikus interfész implementációt várja paraméterként, ahol a T a List-ben lévő lista elemek típusa. Valójában a T listaelemek bármilyen leszármazottját elfogadja. A forEach metódus az összes listaelemen végigmegy, és minden egyes listaelemre meghívja a Consumer<T> implementáció accept() metódusát. Az implementáción múlik, hogy mit fog csinálni az adott listaelemmel.

A Consumer interfészben az accept az egyetlen absztrakt metódus, tehát a Consumer egy funkcionális interfész, ahogy ez az annotációból is látszik:

package java.util.function;
@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
ImportantIcon.png

Note
A @FunctionalInterface annotáció hatására a fordító ellenőrzi, hogy az adott interfész valóban megfelel e a funkcionális interfészekkel támasztott követelményeknek.

  • Csak interfészre kerülhet ilyen annotáció
  • Az interfésznek pontosan 1 darab absztrakt metódusa van (vagyis implementálandó)



Az alábbi Lambda kifejezéssel inline implementációt készítettünk a funkcionális interfészhez, ami egy Lista elem típusú paramétert vár és void a visszatérési értéke.

items.forEach(item->System.out.println(item));



A Lambda kifejezést kicserélhetjük method reference-re is:

items.forEach(System.out::print);

Ez egy statikus metódus referencia, amivel azt mondjuk meg, hogy a Consumer implementációja a System.out.print(T) metódust fogja meghívni. A lényeg, hogy egy argumentumos legyen a megadott metódus és fel tudjon dolgozni T lista típusú elemet.