Hinweise zur Stream-API und zu SQL von Java

Ein Hinweis zum Kontrast zwischen der Stream-API von Java und SQL.

Offizielle Stream-Dokumentation

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.

Liste der Vergleiche zwischen Stream API und SQL

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

Beispielcode

Voraussetzungen

Personendaten und Klasse

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 " definiert. 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

Hinweise zur Stream-API und zu SQL von Java
Hinweise zum Java-Pfad und -Paket
Betrachten wir die Bedeutung von "Stream" und "Collect" in der Stream-API von Java.
Heutzutage Java Lambda Expressions und Stream API
API-Memo streamen
Hinweise zur Implementierung der Google Books-API in den Versionen Java Okhttp und Gson sowie Okhttp und Jackson
Zusammenfassung der gegenseitigen Konvertierung zwischen Groovys Standard-Groovy-Methoden und Javas Stream-API
Java Stream API
Installieren Sie mehrere Javas und wechseln Sie unter Ubuntu zwischen ihnen
[Für Anfänger] Über Lambda-Ausdrücke und Stream-API
Laden Sie Notizen in Java auf S3 hoch und laden Sie sie herunter
Grundlagen der Stream-API
[Inhouse-Lernsitzung] Java-Grundlagen - Lambda-Ausdruck und Stream-API - (13.07.2017)
Die Stream-API von Java ist super schnell, wenn sie gut verwendet wird
Hinweise zu Protokollpuffern
[Java] Stream Collectors Hinweis
Python-Memo auf Docker
Stream-API (Collectors-Klasse)
[Android] Hinweise zu XML
[Java] Stream API / Map
Stream-API-Zuordnungsmethode
Hinweise zu regulären Ausdrücken
Ich war seltsamerweise süchtig danach, Javas Stream-API mit Scala zu verwenden