Remarques sur l'API Stream et SQL de Java

Une note sur le contraste entre l'API Stream de Java et SQL.

Documentation officielle du Stream

Extrait de la documentation officielle de Java 8. https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html

Séquence d'éléments prenant en charge les opérations d'agrégation séquentielles et parallèles. (Omis) La collection et le flux ont des similitudes en surface, mais ont des objectifs différents. La collection est principalement axée sur la gestion efficace et l'accès aux éléments. Les flux, en revanche, n'ont aucun moyen d'accès direct ou de manipulation d'éléments, mais se concentrent plutôt sur la description déclarative de la source et des opérations de calcul effectuées sur cette source. (Omis) Les pipelines de flux peuvent être exécutés séquentiellement ou en parallèle. Ce mode d'exécution est l'une des propriétés du flux. Lorsque vous créez un flux, vous faites un premier choix d'exécution séquentielle ou parallèle.

C'est difficile à comprendre même si je lis le document parce que je ne comprends pas assez, mais si je l'écris grossièrement, c'est comme ça.

Les opérations d'agrégation seront plus faciles à comprendre si vous pouvez imaginer SQL.

Liste de comparaison entre Stream API et SQL

Stream API SQL correspondant La description
Stream#map SELECT Opération pour convertir un élément dans Stream en une autre valeur ou un autre objet
Stream#filter WHERE Une opération qui filtre uniquement les données qui correspondent aux conditions. Il est nécessaire d'écrire une expression qui renvoie booléen comme argument.
Stream#max MAX Obtenez le maximum
Stream#min MIN Obtenez la valeur minimale
IntStream#sum
Collectors#summingInt
SUM Obtenez le total

Exemple de code

Conditions préalables

Données de personne et classe

La table qui stocke les données de la personne et la classe qui contient les données sont définies comme suit.

■ Table des personnes

id name age job
1 yamada 25 ---:
2 suzuki 28 ---:
3 sato 30 ---:
4 nakamura 41 ---:
5 yamamoto 38 ---:
6 akiyama 22 ---:
7 tanabe 43 ---:
8 ito 24 ---:

■ Classe de personne

Persion.java


@Data
@AllArgsConstructor
public class Person {
    private int id;
    private String name;
    private int age;
}

De plus, une liste contenant toutes les données de la table Person est définie comme «List ». «List » est synonyme de:

List<Person> personList = Arrays.asList(
    new Person(1, "yamada", 25),
    new Person(2, "suzuki", 28),
    new Person(3, "sato", 30))
    new Person(4, "nakamura", 41))
    new Person(5, "yamamoto", 38))
    new Person(6, "akiyama", 22))
    new Person(7, "tanabe", 43))
    new Person(8, "ito", 24))
);

Stream#map

Java


List<String> nameList = personList.stream()
        .map(Person::getName)
      .collect(Collectors.toList()); 

SQL


SELECT
  p.name
FROM
  Person p


Résultat
["yamada", "suzuki", "sato", "nakamura, "yamamoto", "akiyama", "tanabe", ito]

Stream#filter

Java


List<String> nameList = personList.stream()
        .filter(p -> p.getAge() >= 40)
        .map(Person::getName)
        .collect(Collectors.toList()); 

SQL


SELECT
  p.name
FROM
  Person p
WHERE
  p.age >= 40 


Résultat
["nakamura", "tanabe"]

Stream#max

Java


Integer max = personList.stream()
        .map(Person::getAge)
        .max(Comparator.comparingInt(x -> x))
        .orElse(null);

SQL


SELECT
  max(p.age) max_age
FROM
  Person p


Résultat
43

Stream#min

Java


Integer max = personList.stream()
        .map(Person::getAge)
        .min(Comparator.comparingInt(x -> x))
        .orElse(null);

SQL


SELECT
  min(p.age) min_age
FROM
  Person p


Résultat
22

IntStream#sum/Collectors#summingInt

Java


int sum = personList.stream()
        .mapToInt(Persion::getAge)
        .sum();

int sum2 = personList.stream()
        .collect(Collectors.summingInt(Persion::getAge));

SQL


SELECT
  sum(p.age) sum_age
FROM
  Person p


Résultat
251

Recommended Posts

Remarques sur l'API Stream et SQL de Java
Remarques sur le chemin et le package Java
Examinons la signification de "stream" et "collect" dans l'API Stream de Java.
De nos jours, les expressions Java Lambda et l'API de flux
Mémo API Stream
Remarques sur la mise en œuvre de l'API Google Books dans les versions java okhttp et gson et les versions okhttp et jackson
Résumé de la conversion mutuelle entre les méthodes Groovy par défaut de Groovy et l'API Stream de Java
API Java Stream
Installez plusieurs Javas et basculez entre eux sur Ubuntu
[Pour les débutants] À propos des expressions lambda et de l'API Stream
Télécharger et télécharger des notes en java sur S3
Principes de base de l'API Stream
[Session d'étude interne] Principes de base de l'expression Java-Lambda et de l'API Stream- (13/07/2017)
L'API Stream de Java est super rapide si elle est bien utilisée
Remarques sur les tampons de protocole
[Java] Remarque sur les collecteurs de flux
mémo python sur docker
API Stream (classe Collectors)
[Android] Notes sur xml
[Java] API / carte de flux
Méthode de mappage de l'API Stream
Notes sur les expressions régulières
Pratique de l'API Java8 Stream
J'étais étrangement accro à l'utilisation de l'API Stream de Java avec Scala