Évaluer java8 ~ Type Lambda ~

Je n'ai écrit aucun code en java8 sur le terrain, j'ai donc ressenti un sentiment de crise et l'ai appris, donc je vais le résumer ici.

Ceci est un exemple qui convertit le contenu de la liste en nombres et le produit. Tout d'abord, un exemple avant java8.

Pas java8.java



		List<String> suuzies = Arrays.asList("1", "2", null, "3");

		for (String suuzi : suuzies) {
			if (suuzi == null) {
				continue;
			}
			System.out.println(Integer.parseInt(suuzi));
		}
		
		// 1 2 3

Vient ensuite java8.

java8.java


        List<String> suuzies = Arrays.asList("1", "2", null, "3");
		
        suuzies.stream().filter(s -> Objects.nonNull(s)).map(s -> Integer.parseInt(s))
               .forEach(s -> System.out.println(s));
		// 1 2 3

Génial! Il tient dans une ligne et améliore la lisibilité! Quand je l'ai vu pour la première fois, je ne l'ai pas compris du tout et j'ai pensé à ce qui améliorerait la lisibilité. Ce sera rafraîchissant à comprendre.

L'ordre de traitement des flux

  1. Génération de flux à partir de la collection
  2. Traitement intermédiaire
  3. Traitement final Sera. Donc, le code ci-dessus est
  4. Obtenez le flux de la collection
  5. Éliminer null
  6. Convertissez les valeurs survivantes en nombres
  7. Sortie n'est-ce pas! 2 et 3 sont un traitement intermédiaire et 4 est un traitement final. Vous pouvez écrire le processus intermédiaire jusqu'à ce que vous soyez satisfait et vous ne pouvez écrire qu'un seul processus final.

Considérant que vous pouvez écrire le processus comme s'il était connecté par une flèche comme décrit ci-dessus, Je pense certainement que la lisibilité s'est améliorée. Au niveau du terrain, si et pour souvent rendre le nid chaotique, Cela semble très facile à lire.

À propos, le code java8.java peut également être écrit comme suit.

java8(2).java


        List<String> suuzies = Arrays.asList("1", "2", null, "3");

		suuzies.stream().filter(Objects::nonNull).map(Integer::parseInt)
				.forEach(System.out::println);
		// 1 2 3

Il utilise des références de méthode, ce qui rend le code encore plus court, Je vais omettre l'explication ici.

Maintenant que vous comprenez stream, je vais écrire un peu sur les expressions lambda.

L'API Stream fournit plusieurs méthodes utilisées pour le traitement intermédiaire et le traitement final. Par exemple, la méthode de filtrage illustrée ci-dessus ressemble à ceci.

Stream.class


        Stream<T> filter(Predicate<? super T> predicate);

J'étais allergique quand je l'ai vu pour la première fois. Il a fermé immédiatement.

Jetons également un œil à (Predicate <? Super T>) dans l'argument de filtre.

Predicate.class


@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

Ceci est une interface fonctionnelle. Une expression lambda est une expression qui peut implémenter une interface fonctionnelle avec une brève description.

À propos, une interface fonctionnelle est une interface dans laquelle une seule méthode abstraite est définie. Il est acceptable d'inclure des méthodes statiques et par défaut autres que des méthodes abstraites, mais elles sont ignorées en tant que condition. La classe Predicate ne cible que le «test booléen (T t)», les autres sont ignorés.

Comme vous pouvez le voir, cette interface prend un argument de type T et renvoie une valeur de retour de type booléen. Répétez la partie filtre du code précédent (java8.java).

java8.java



        filter(s -> Objects.nonNull(s))

Il implémente l'argument de filtre de Stream.class. Cette pièce est de type lambda!

Il existe plusieurs autres interfaces fonctionnelles disponibles. Avec la carte utilisée dans java8.class,

Stream.class



        <R> Stream<R> map(Function<? super T, ? extends R> mapper);

Regardons également le contenu de l'argument Function.

Function.class



@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);

// and more

}

Une méthode qui prend un type T comme argument et renvoie un type R! En d'autres termes, il traite l'argument reçu et le renvoie sous une autre forme!

Répétez la partie map de java8.java plus tôt.

java8.java



        map(s -> Integer.parseInt(s))

Vous prenez un caractère comme argument, vous le convertissez en nombre et vous le retournez!

La syntaxe de l'expression lambda ressemble à ceci.

(Argument) -> {Traitement}

C'est une manière d'écrire car il n'y a qu'une seule méthode abstraite ♪ Il y a d'autres consommateurs qui n'ont aucune valeur de retour et des fournisseurs qui n'acceptent aucun argument!

Je pense que l'expression lambda a été faite pour Stream! Au début de l'étude, je me demande s'il existe une interface pour une méthode abstraite. J'ai pensé, mais nous, les développeurs, mettrons en œuvre les éléments préparés dans un style lambda J'ai pensé que ce serait pratique si je l'utilisais!

J'ai encore beaucoup à faire, je vais donc approfondir ma compréhension à partir de maintenant!

Recommended Posts

Évaluer java8 ~ Type Lambda ~
[Java] Expression Lambda
Expression lambda Java
expression 1 de la table lambda neutre java
Variations d'expressions lambda Java
Fonctionnalité d'expression lambda Java 8
mémo d'expression java lambda
Etudier Java 8 (expression lambda)
Expression lambda Java à nouveau
[Java] Interface fonctionnelle / expression lambda
Revue Java
Flux Java8, résumé de l'expression lambda
Contenu d'apprentissage de base Java 9 (expression lambda)
Qu'est-ce qu'une expression lambda (Java)
Bonjour Java Lambda
java IO examen
Récapitulons maintenant l'expression lambda Java
NIO.2 examen de Java
Avis sur Java Shilber
apprentissage java (expression conditionnelle)
Quarkus enregistre Java Lambda! ??
Comprendre les expressions lambda Java 8
Notes de révision de Java NIO 2
Examen de la classe interne Java
Comment utiliser l'API Java avec des expressions lambda
Consultez les annotations Java maintenant
À propos des expressions Java lambda
Java 8 pour démarrer maintenant ~ for Each et expression lambda ~
Introduction au style lambda
Expliquer les expressions lambda Java 8
Examen NIO de Java
Injection d'expression de table Java
résumé des expressions régulières java
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle de commande -
Premiers pas avec les anciens ingénieurs Java (Stream + Lambda)
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle d'objet nul -
Repenser les modèles d'expression et de conception de flux Java8 - Modèle de méthode
Utiliser des couches Lambda avec Java
Révision et résumé de Progate Java (débutant)
Notes de révision de Java Collections Framework
[Java] Introduction à l'expression lambda
Qu'est-ce qu'une expression lambda?
Attribuer des expressions lambda Java8 aux variables et les réutiliser
Expression lambda Java apprise avec Comparator
[Introduction à Java] À propos des expressions lambda
À propos de Lambda, Stream, LocalDate de Java8
Java sur AWS Lambda est-il lent?
Hello World avec AWS Lambda + Java
Essayez une expression If en Java
Java
Java
L'origine des expressions Java lambda
Comment utiliser les expressions Java lambda
Comparaison des méthodes d'implémentation de thread en Java et de la méthode d'expression lambda
Je veux ForEach un tableau avec une expression Lambda en Java
J'ai essayé de résumer les expressions Java lambda
De nos jours, les expressions Java Lambda et l'API de flux