Une note sur le contraste entre l'API Stream de Java et SQL.
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.
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 |
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<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