De nos jours, les expressions Java Lambda et l'API de flux

Cela fait longtemps depuis la sortie de Java8, mais j'utilise les expressions lambda et l'API Stream pour une raison quelconque, je vais donc le résumer à nouveau.

Style Lambda

Les expressions Lambda sont un moyen simple d'implémenter une interface qui n'a qu'une seule méthode, appelée interface fonctionnelle.

Interface fonctionnelle

Dans un langage fonctionnel comme lisp ou un langage avec un pointeur de fonction comme C, vous pouvez facilement passer une "fonction", mais en java vous ne pouvez pas la passer à moins que la fonction ne soit un objet. Par conséquent, il est possible de passer une fonction en préparant une interface fonctionnelle comme indiqué ci-dessous.

Func.java


package jp.foo;

public interface Func {
	public double apply(double x);
}

Une interface fonctionnelle est une interface qui n'a qu'une seule méthode abstraite.

Implémentation de l'interface fonctionnelle

Jusqu'à java7, la méthode abstraite était remplacée comme suit.

Func g = new Func(){
	@Override
	public double apply(double x) {
		return x * x;
	}
};

En java8, la description peut être simplifiée comme suit en tirant parti du fait que l'interface fonctionnelle n'a qu'une seule méthode. C'est l'expression lambda.

Func f = x -> x * x;

Si vous écrivez un peu plus étroitement

Func f = (x) -> {return x * x;};

Généralement, il est décrit comme (argument 1, argument 2, ...) -> {Process 1; Process 2; ...}. Bien sûr, s'il n'y a pas d'argument ou pas de retour, vous pouvez l'écrire vide comme () -> {}. Il s'agit simplement de remplacer une seule méthode dans l'interface fonctionnelle. L'interface fonctionnelle simplifie la description en tirant parti du fait qu'il n'y a qu'une seule méthode à remplacer.

Cette expression lambda est utile, par exemple, lors de l'utilisation d'une méthode qui prend une interface fonctionnelle comme argument (par exemple, comme indiqué ci-dessous).

FuncUser.java


package jp.foo;

public class FuncUser {
	public static void samplePrintFunc(Func f) {
		for(double x = 1.0; x <= 3.0; x += 1.0) {
			System.out.println(f.apply(x));
		}
	}
}

La description simple sera la suivante.

FuncUser.samplePrintFunc(x -> x * x);
FuncUser.samplePrintFunc(x -> Math.sin(x));

Si le processus devient un peu compliqué, vous pouvez décrire plusieurs processus en les enfermant dans {// décrire plusieurs processus}.

FuncUser.samplePrintFunc(x -> { a = Math.sin(x); b = Math.cos(x); return a * b; });

S'il n'y a qu'un seul processus et que le type d'argument de l'interface de type de fonction et le type d'argument de la méthode que vous souhaitez utiliser sont identiques, vous pouvez l'omettre comme suit.

FuncUser.samplePrintFunc(Math::sin);

Les expressions lambda sont donc une grammaire puissante pour passer des fonctions.

Stream API

L'API Stream est un outil qui effectue le traitement de la collection à l'aide d'expressions lambda comme décrit ci-dessus. C'est une API conçue avec un style lambda. J'ai résumé celles que j'utilise souvent à titre d'exemple.

forEach Il semble que seul forEach puisse être utilisé sans appeler la méthode stream.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).forEach(System.out::println);

filter C'est pratique car il effectue une recherche raffinée. C'est facile car vous n'avez pas à écrire une instruction if dans chaque instruction for.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().filter(x -> x > 3.0).forEach(System.out::println);

map Il est utilisé lorsque vous souhaitez créer une autre liste et définir à partir d'une liste ou d'un ensemble.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().map(x -> x * x).forEach(System.out::println);

collect collect est puissant et élimine presque l'écriture pour les déclarations.

Écrire collect (fournisseur (variable en dehors de pour), accumulateur [processus à l'intérieur pour], combineur [processus pour collecter le fournisseur au moment du traitement parallèle]).

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().collect(HashMap::new, (map, x) -> map.put(x, x * x), (map1, map2) -> map1.forEach(map2::put)).entrySet().forEach(System.out::println);

En outre, il est pratique d'utiliser des collectionneurs. Le traitement que vous effectuez souvent est bien résumé et complet.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 1.0, 5.4 }).stream().collect(Collectors.toSet()).forEach(System.out::println);

mapToDouble etc... Si vous utilisez le flux mapTo [valeur numérique], vous pouvez utiliser average, max et min, ce qui est utile.

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().mapToDouble(x -> x).average().ifPresent(System.out::println)

Essayez de trouver l'écart type

Trouvons l'écart type.

\sigma = \sqrt{\frac{1}{n} \sum_{i = 1}^n (x_i - \mu)^2}

La partie désirée suivante elle-même est multipliée par 2 lignes (2ème et 3ème lignes).

List<Double> sample = Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 });
double mu = sample.stream().mapToDouble(x -> x).average().getAsDouble();
double siguma = Math.sqrt(sample.stream().map(x -> Math.pow(x - mu, 2.0)).mapToDouble(x -> x).average().getAsDouble());
System.out.println(siguma);

Recommended Posts

De nos jours, les expressions Java Lambda et l'API de flux
Gérez les exceptions avec fraîcheur avec les expressions lambda Java 8 et l'API Stream
[Pour les débutants] À propos des expressions lambda et de l'API Stream
Utiliser des expressions Java lambda en dehors de l'API Stream
API Java Stream
[Java] API / carte de flux
Comprendre les expressions lambda Java 8
Pratique de l'API Java8 Stream
À propos des expressions Java lambda
Expliquer les expressions lambda Java 8
[Java] Trier la liste à l'aide de flux et d'expressions lambda
API Java Stream en 5 minutes
Flux Java8, résumé de l'expression lambda
[Java] Introduction à l'expression lambda
[Java] Stream API - Traitement de l'arrêt du flux
[Java] Stream API - Traitement intermédiaire de flux
[Java] Introduction à l'API Stream
[Java] Opération intermédiaire de l'API Stream
Repenser les modèles de conception avec les expressions lambda Java8 et Stream --Builder pattern -
Expression lambda Java apprise avec Comparator
[Introduction à Java] À propos des expressions lambda
Java pour les débutants, les expressions et les opérateurs 1
À propos de Lambda, Stream, LocalDate de Java8
Java pour les débutants, les expressions et les opérateurs 2
J'ai essayé d'utiliser l'API Java8 Stream
Java 8 ~ Stream API ~ pour commencer maintenant
L'origine des expressions Java lambda
Comment utiliser les expressions Java lambda
Implémenter l'autorisation API Gateway Lambda dans Java Lambda
Traitement des données à l'aide de l'API de flux de Java 8
Essayez d'utiliser l'API Stream en Java
Essayez différentes méthodes d'API Java Stream (maintenant)
Remarques sur l'API Stream et SQL de Java
Java8 / 9 Beginners: Streaming API addiction points et comment les gérer
Interagir avec l'API de message LINE à l'aide de Lambda (Java)
Mémo API Stream
Créer une API à l'aide de Retrofit2, Okhttp3 et Gson (Java)
[Java] Résumé de la façon d'omettre les expressions lambda
Essayez Java 8 Stream
Efficace Java 3e édition Chapitre 7 Lambda et Stream
Comment utiliser l'API Java avec des expressions lambda
Java et JavaScript
J'ai examiné l'expression lambda de Java, l'API de flux, six mois après avoir commencé Java.
XXE et Java
Java 8 pour démarrer maintenant ~ for Each et expression lambda ~
Bonjour Java Lambda
[Java] Expression Lambda
Étudier Java 8 (Stream)
Terminaison du flux Java
Expression lambda Java
[Java] Traitement de flux
Principes de base de l'API Stream
Java 9 Facultatif :: stream
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle de commande -
Organisez la différence de confort d'écriture entre l'expression lambda Java et l'expression lambda Kotlin.
Essayé l'API Toot et Streaming de Mastodon en Java