Ein Hinweis zum Kontrast zwischen der Stream-API von Java und SQL.
Auszug aus der offiziellen Java 8-Dokumentation. https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html
Eine Folge von Elementen, die sequentielle und parallele Aggregatoperationen unterstützt. (Weggelassen) Sammlung und Stream haben Ähnlichkeiten an der Oberfläche, haben aber unterschiedliche Zwecke. Die Sammlung konzentriert sich hauptsächlich auf die effiziente Verwaltung und den Zugriff auf Elemente. Streams hingegen haben keinen direkten Zugriff auf oder manipulierte Elemente, sondern konzentrieren sich auf die deklarative Beschreibung der Quelle und der an dieser Quelle ausgeführten Rechenoperationen. (Weggelassen) Stream-Pipelines können entweder nacheinander oder parallel ausgeführt werden. Dieser Ausführungsmodus ist eine der Eigenschaften des Streams. Wenn Sie einen Stream erstellen, treffen Sie zunächst die Wahl zwischen sequentieller oder paralleler Ausführung.
Es ist schwer zu verstehen, selbst wenn ich das Dokument lese, weil ich nicht genug verstehe, aber wenn ich es grob schreibe, ist es so.
Aggregationsoperationen sind leichter zu verstehen, wenn Sie sich SQL vorstellen können.
Stream API | Entsprechende SQL | Erläuterung |
---|---|---|
Stream#map | SELECT | Operation zum Konvertieren eines Elements in Stream in einen anderen Wert oder ein anderes Objekt |
Stream#filter | WHERE | Eine Operation, die nur Daten filtert, die den Bedingungen entsprechen. Es ist erforderlich, einen Ausdruck zu schreiben, der als Argument einen Booleschen Wert zurückgibt. |
Stream#max | MAX | Holen Sie sich das Maximum |
Stream#min | MIN | Holen Sie sich den Mindestwert |
IntStream#sum Collectors#summingInt |
SUM | Holen Sie sich insgesamt |
Die Tabelle, in der die Personendaten gespeichert sind, und die Klasse, in der die Daten gespeichert sind, sind wie folgt definiert.
■ Personentabelle
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 | ---: |
■ Personenklasse
Persion.java
@Data
@AllArgsConstructor
public class Person {
private int id;
private String name;
private int age;
}
Darüber hinaus ist eine Liste mit allen Daten der Personentabelle als "Liste List <Person>
ist gleichbedeutend mit:
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
Ergebnis
["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
Ergebnis
["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
Ergebnis
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
Ergebnis
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
Ergebnis
251
Recommended Posts