Java 9 a également été publié, mais je ne suis toujours pas sûr de Java 8, je vais donc le résumer.
forEach()
En Java8, la méthode forEach ()
a été ajoutée à List, Map, arrays, etc.
Avant Java 7
for(String s : list) {
System.out.println(s);
}
Et le processus qui utilisait 3 lignes
list.forEach(s -> System.out.println(s));
Vous pouvez maintenant écrire sur une seule ligne.
Pourquoi est-ce que je peux l'écrire comme ça?
En Java8, une interface qui n'a qu'une seule méthode abstraite est appelée interface fonctionnelle et peut être transmise en tant qu'expression lambda.
FunctionalIf.java
@FunctionalInterface
public interface FunctionalIf {
public String retStr(int number);
}
Cependant, les méthodes suivantes peuvent être incluses -Méthode statique ・ Méthode par défaut -Override de la méthode publique de java.lang.Object (toString () et equals ())
L'ajout de l'annotation @ FunctionalInterface
entraînera une erreur de compilation lorsque les conditions ne sont pas remplies, mais ce n'est pas obligatoire.
Les expressions Lambda sont des grammaires introduites dans Java 8. Vous pouvez implémenter une interface fonctionnelle avec la syntaxe suivante
(Arguments de la méthode à implémenter) -> {En traitement}
FunctionalIf func = (int num) -> { return num +" * 2 = " + num*2;};
Cela seul est assez concis, mais il peut être omis davantage.
FunctionalIf func = num -> { return num +" * 2 = " + num*2;};
Puisqu'il y a un argument, `` num '' peut être déduit comme étant de type int.
FunctionalIf func = num -> num +" * 2 = " + num*2;
Puisqu'il s'agit d'une phrase simple, le résultat de la phrase peut être déduit comme sortie.
J'ai fini avec ce format
//Implémenter une interface fonctionnelle avec une expression lambda
FunctionalIf func = num -> num +" * 2 = " + num*2;
//Utilisez la méthode implémentée
System.out.println(func.retStr(1));
System.out.println(func.retStr(2));
Résultat d'exécution
1 * 2 = 2
2 * 2 = 4
La méthode forEach () de Java 8 peut être utilisée dans une classe qui implémente la méthode d'interface Iterable default void forEach (Consumer <? Super T> action)
.
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Iterable.html#forEach-java.util.function.Consumer-
L'argument Consumer '' est une interface fonctionnelle avec
void accept (T t) '' (reçoit n'importe quel argument et ne retourne pas de valeur).
https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/Consumer.html
list.forEach(s -> System.out.println(s));
Donc, vous avez passé l'implémentation de `` Consumer '' comme argument de la méthode forEach () dans une expression lambda.
Les variables déclarées en dehors de l'expression lambda peuvent être référencées dans l'expression lambda. Cependant, il ne peut pas être modifié.
String str = " item";
list.forEach(s -> {
System.out.println(s + str); //Peut être référencé
// str = " changed"; //Le changement est mauvais
});
De plus, les variables déclarées en dehors de l'expression lambda ne peuvent pas être utilisées dans les noms d'argument des variables (une erreur de compilation se produira).
Vous ne pouvez pas utiliser un seul «_» dans le nom de variable d'un argument d'expression lambda.
Recommended Posts