7,540
edits
Changes
Java-mis
,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()==
<source lang="java">
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));
</source>
Ez miért működik?
<br>
A List a java.lang.Iterale osztály leszármazottja. Ebben van egy default metódus implementáció a forEach-re.
<source lang="java">
package java.lang;
public interface Iterable<T> {
...
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
...
</source>
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.
<br><br>
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:
<source lang="java">
package java.util.function;
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
</source>
{{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. <br>
* Csak interfészre kerülhet ilyen annotáció
* Az interfésznek pontosan 1 darab absztrakt metódusa van (vagyis implementálandó)
}}
<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.
<source lang="java">
items.forEach(item->System.out.println(item));
</source>