Difference between revisions of "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()) |
||
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);
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.