Was ich über Java 8 recherchiert habe

Überblick

Um das Java-Wissen zu aktualisieren, das bei "1.4" gestoppt wurde Ich lerne etwas über Java7,8,9. Dieses Mal werde ich nur beschreiben, was ich über die in "8" hinzugefügten Funktionen untersucht habe.

Was ich nachgeschlagen habe

Optional Es ist jetzt möglich, explizit anzugeben, ob der Rückgabewert null enthalten darf. Sie können auch festlegen, was zu tun ist, wenn beim Abrufen kein Wert vorhanden ist.

public Optional<String> getGyunyu(String name) {
  Map<String, String> gyunyu = new HashMap<>();
  gyunyu.put("Milch", "コーヒーMilch");
  return Optional.ofNullable(gyunyu.get(name));
}
Optional<String> gyunyu = getGyunyu("Tee");
System.out.println(gyunyu.orElse("Nicht Milch")); // 「Nicht Milch」が出力される

--ofNullable (T-Wert): Optional generieren. Wenn der Wert nicht null ist, wird eine Option zurückgegeben, die den Wert beschreibt, andernfalls wird eine leere Option zurückgegeben. --orElse (T other): Gibt den Wert zurück, falls vorhanden, andernfalls wird other zurückgegeben.

Sie können das Vorhandensein eines Werts auch mit der Methode isPresent () überprüfen.

Optional<String> gyunyu = getGyunyu("Tee");
if (!gyunyu.isPresent()) {
  System.out.println("Nicht Milch");
}

In diesem Fall ist es meines Erachtens nicht viel anders als "if (Rückgabewert == null)", aber wenn es null ist, sollte der Wert wiederholt werden. Es scheint, dass es verwendet werden kann, wenn Sie zusätzliche Verarbeitung durchführen möchten.

Optionale Klasse

interface Schnittstelle kann jetzt eine Implementierung haben. Durch Schreiben des Standardschlüsselworts können Sie eine Methode mit einer Implementierung schreiben.

Gyunyu.java


public interface Gyunyu {
  public default void print() {
    System.out.println("Milch");
  }
}

Coffee.java


public class Coffee implements Gyunyu {
  //Ich habe die Druckmethode nicht überschrieben, erhalte jedoch keinen Kompilierungsfehler
}
Gyunyu gyunyu = new Coffee();
gyunyu.print();

Erstellen Sie eine "Milk" -Schnittstelle, die die "Gyunyu" -Schnittstelle und erbt Wenn Sie es in der Ichigo-Klasse implementieren und die print () -Methode aufrufen,

Milk.java


public interface Milk extends Gyunyu {
  public default void print() {
    System.out.println("Milch");
  }
}

Ichigo.java


public class Ichigo implements Milk {
}
Gyunyu gyunyu = new Ichigo();
gyunyu.print(); //"Milch" wird ausgegeben

Die Methode, die der Klasse am nächsten kommt, die die Methode aufruft (in diesem Fall die Milk-Schnittstelle print ()), wird ausgeführt.

Date and Time API

Holen Sie sich das aktuelle Datum und die Uhrzeit

Sie können das aktuelle Datum und die aktuelle Uhrzeit mithilfe der Methode "now ()" abrufen.

//Keine Zeitzoneninformationen
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.getYear());
System.out.println(localDateTime.getMonthValue());
System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDateTime.getHour());
System.out.println(localDateTime.getMinute());
System.out.println(localDateTime.getSecond());
System.out.println(localDateTime.getNano());
		
//Mit Zeitzoneninformationen
ZonedDateTime zoneDatetime = ZonedDateTime.now();
System.out.println(zoneDatetime.getYear());
System.out.println(zoneDatetime.getMonthValue());
System.out.println(zoneDatetime.getDayOfMonth());
System.out.println(zoneDatetime.getHour());
System.out.println(zoneDatetime.getMinute());
System.out.println(zoneDatetime.getSecond());
System.out.println(zoneDatetime.getNano());
System.out.println(zoneDatetime.getZone().getId()); // 「Asia/"Tokyo" wird ausgegeben

Wird im japanischen Kalender angezeigt

JapaneseDate japaneseDate = JapaneseDate.now();
System.out.println(japaneseDate.getEra()); //"Heisei" wird ausgegeben
System.out.println(japaneseDate.get(ChronoField.YEAR_OF_ERA)); //"29" wird angezeigt

Addition und Subtraktion

LocalDateTime localDateTime = LocalDateTime.now();

LocalDateTime tomorrow = localDateTime.plusDays(1);
System.out.println(tomorrow.getDayOfMonth()); //"30" wird ausgegeben, wenn es am 29. November ausgeführt wird

LocalDateTime yesterday = localDateTime.minusDays(1);
System.out.println(yesterday.getDayOfMonth()); //"28" wird ausgegeben, wenn es am 29. November ausgeführt wird

Base64-Codierung / -Decodierung

Es wird jetzt standardmäßig unterstützt.

String coffee = "Kaffee Milch";
		
Encoder encoder = Base64.getEncoder();
String encodeCoffee = encoder.encodeToString(coffee.getBytes());
System.out.println(encodeCoffee); //"44Kz44O844OS44O854mb5Lmz" wird ausgegeben
		
Decoder decoder = Base64.getDecoder();
String decodeCoffee = new String(decoder.decode(encodeCoffee));
System.out.println(decodeCoffee); //"Kaffeemilch" wird ausgegeben

Verkettung von Strings

Mit String.join () ist es jetzt möglich, mehrere Strings einfach mit einem beliebigen String zu verbinden.

String[] gyunyu = {"Kaffee Milch", "Remon Milch", "Erdbeermilch"};
System.out.println(String.join("###", gyunyu)); //"Kaffee Milch###Remon Milch###Ausgabe mit "Erdbeermilch"
List<String> gyunyu = new ArrayList<>();
gyunyu.add("Kaffee Milch");
gyunyu.add("Remon Milch");
gyunyu.add("Erdbeermilch");
System.out.println(String.join("###", gyunyu)); //"Kaffee Milch###Remon Milch###Ausgabe mit "Erdbeermilch"

Ähnliche Verknüpfungen können mit der Klasse "java.util.StringJoiner" vorgenommen werden.

StringJoiner gyunyu = new StringJoiner("###");
gyunyu.add("Kaffee Milch");
gyunyu.add("Remon Milch");
gyunyu.add("Erdbeermilch");
System.out.println(gyunyu); //"Kaffee Milch###Remon Milch###Ausgabe mit "Erdbeermilch"

Die StringJoiner-Klasse kann auch durch Angabe eines Präfixes und eines Suffixes verbunden werden.

StringJoiner gyunyu = new StringJoiner(" > ", "[Mögen]", "[Hass]");
gyunyu.add("Kaffee Milch");
gyunyu.add("Remon Milch");
gyunyu.add("Erdbeermilch");
System.out.println(gyunyu); //「[Mögen]Kaffee Milch>Remon Milch>Erdbeermilch[Hass]Wird ausgegeben

Lambda-Stil

Es wird in der folgenden Grammatik beschrieben.

(Methodenargumente) -> {wird bearbeitet}

Durch die Verwendung des Lambda-Ausdrucks scheint der Prozess präzise geschrieben zu werden ... Wenn es die folgende Schnittstelle und Verarbeitung gibt

public interface Gyunyu {	
  public void output(String v);
}
Gyunyu gyunyu = new Gyunyu() {
  @Override
  public void output(String v) {
    System.out.println(v);
  }
};
gyunyu.output("Kaffee Milch"); //「Kaffee Milch」と出力される

Unter Verwendung des Lambda-Ausdrucks kann die Beschreibung wie folgt lauten.

Gyunyu gyunyu = (String v) -> { System.out.println(v); };
gyunyu.output("Kaffee Milch"); //「Kaffee Milch」と出力される

Darüber hinaus wird der Argumenttyp abgeleitet und kann weggelassen werden. Wenn es nur ein Argument gibt, können auch die Klammern "()" weggelassen werden. Wenn es nur einen Ausdruck gibt, kann die wellenförmige Klammer "{}" weggelassen werden, sodass die Beschreibung wie folgt lauten kann.

Gyunyu gyunyu = v -> System.out.println(v);
gyunyu.output("Kaffee Milch");

Funktionsschnittstelle

Eine Schnittstelle, die nur eine abstrakte Methode deklariert. Wenn die im Lambda-Ausdruck geschriebene Gyunyu-Schnittstelle zu einer funktionalen Schnittstelle gemacht wird, Die Beschreibung lautet wie folgt.

Gyunyu.java


@FunctionalInterface
public interface Gyunyu {
   public void output(String s);
}

Durch Hinzufügen der Annotation @ FunctionalInterface kann explizit angegeben werden, dass es sich um eine funktionale Schnittstelle handelt. Es kann ein Kompilierungsfehler ausgegeben werden, wenn die Bedingungen der Funktionsschnittstelle nicht erfüllt sind.

Methodenreferenz

Da das Argument in der Methodenreferenz weggelassen werden kann, kann der Umfang der Beschreibung im Vergleich zum Lambda-Ausdruck reduziert werden. Ausführen einer statischen Methode oder einer Instanzmethode.

--Notationsmethode

Klassenname (Instanzname) :: Methodenname

Beim Verweisen auf eine Instanzmethode

Gyunyu gyunyu = System.out::println;
gyunyu.output("Kaffee Milch"); //「Kaffee Milch」と出力される

Wenn das Obige durch einen Lambda-Ausdruck beschrieben wird, kann es wie folgt beschrieben werden.

Gyunyu gyunyu = v -> System.out.println(v);
gyunyu.output("Kaffee Milch");

Wenn die Methode, auf die Sie verweisen möchten, Ihre eigene Klasse ist, verwenden Sie "this"

Main.java


public void println(String v) {
  System.out.println(v);
}

public void execute() {
  List<String> gyunyu = Arrays.asList("Kaffee Milch", "Erdbeermilch", "Remon Milch");
  gyunyu.forEach(this::println);
}

public static void main(String[] args) {
  (new Main()).execute();
}

Beim Verweisen auf eine statische Methode

Main.java


public static void output(String v) {
  System.out.println(v);
}

public static void main(String[] args) {
  List<String> gyunyu = Arrays.asList("Kaffee Milch", "Erdbeermilch", "Remon Milch");
  gyunyu.forEach(Main::output);
}

Stream API Eine API, die Werte aggregieren und die Verarbeitung mithilfe von Daten durchführen kann. Der grundlegende Verarbeitungsablauf ist

  1. Stream-Generierung
  2. Zwischenverarbeitung
  3. Kündigungsprozess so werden.

Stream-Generierung

String[] gyunyu1 = {"Kaffee Milch", "Kaffee Milch", "Erdbeermilch", "Erdbeermilch", "Remon Milch", "Zitronenmilch"};
Stream<String> stream1 = Arrays.stream(gyunyu1);

String[] gyunyu2 = {"Melonenmilch", "Apfelmilch", "Melonenmilch", "Traubenmilch"};
Stream<String> stream2 = Stream.of(gyunyu2);
List<String> gyunyu3 = Arrays.asList("Früchte", "Banane", "Suika");
Stream<String> stream3 = gyunyu3.stream();
Map<String, String> gyunyu4 = new HashMap<>();
gyunyu4.put("1", "Oberschenkelmilch");
gyunyu4.put("2", "Biwa");
gyunyu4.put("3", "Ichijiku Milch");
Stream<Entry<String, String>> stream4 = gyunyu4.entrySet().stream();

Referenz: Stream-Generierung

Zwischenbetrieb

Verarbeitung zum Eingrenzen und Bearbeiten von Steam und Erstellen eines neuen Streams.

--Wenn Sie die Elemente eingrenzen

//Ich möchte nur Zeichenketten extrahieren, die Milch enthalten
String[] gyunyu1 = {"Kaffee Milch", "Kaffee Milch", "Erdbeermilch", "Erdbeermilch", "Remon Milch", "Zitronenmilch"};
Stream<String> stream1 = Arrays.stream(gyunyu1);
stream1.filter(s -> s.contains("Milch"));
//Ich möchte doppelte Milch entfernen
String[] gyunyu2 = {"Melonenmilch", "Apfelmilch", "Melonenmilch", "Traubenmilch"};
Stream<String> stream2 = Stream.of(gyunyu2);
stream2.distinct();

--Wenn Sie Elemente konvertieren möchten

//Ich möchte Milch hinzufügen
List<String> gyunyu3 = Arrays.asList("Früchte", "Banane", "Suika");
Stream<String> stream3 = gyunyu3.stream();
stream3.map(s -> s + "Milch");

Referenz: Zwischenoperation

Beendigung

Wenn der Beendigungsprozess ausgeführt wird, wird der Zwischenprozess ausgewertet.

//Ich möchte die Anzahl der Fälle einschließlich Milch ausgeben
Map<String, String> gyunyu4 = new HashMap<>();
gyunyu4.put("1", "Oberschenkelmilch");
gyunyu4.put("2", "Biwa");
gyunyu4.put("3", "Ichijiku Milch");
Stream<Entry<String, String>> stream4 = gyunyu4.entrySet().stream();
System.out.println(stream4.filter(s -> s.getValue().contains("Milch")).count()); //"2" wird ausgegeben

--Wenn Sie Elemente einzeln herausnehmen und bedienen möchten

String[] gyunyu1 = {"Kaffee Milch", "Kaffee Milch", "Erdbeermilch", "Erdbeermilch", "Remon Milch", "Zitronenmilch"};
Stream<String> stream1 = Arrays.stream(gyunyu1);
stream1.filter(s -> s.contains("Milch")).forEach(s -> System.out.println(s));

Referenz: Terminierungsverarbeitung

Am Ende

Da der Dienst, für den ich im Geschäft verantwortlich bin, auf Java 5 und 6 ausgeführt wird, habe ich nicht die Möglichkeit, 8 im Geschäft zu verwenden. Ich möchte die Gelegenheit nutzen, um es zu aktualisieren. Ich bin noch nicht mit der Stream-API und den Lambda-Ausdrücken vertraut, daher muss ich mehr über diese beiden Funktionen erfahren.

Recommended Posts

Was ich über Java 8 recherchiert habe
Was ich über Java 6 recherchiert habe
Was ich über Java 9 recherchiert habe
Was ich über Java 7 recherchiert habe
Was ich über Java 5 recherchiert habe
Was ich über Java-Lernen recherchiert habe
Was ich über Kotlin gelernt habe
Was ich mit Java Gold gelernt habe
Was ich mit Java Silver gelernt habe
Über die Java-Schnittstelle
[Java] Informationen zu Java 12-Funktionen
Was ist java
[Java] Über Arrays
Nehmen Sie, was Sie über Java-Reflexion gelernt haben
Etwas über Java
Wo ist mit Java?
Informationen zu Java-Funktionen
Was ist Java <>?
Über Java-Threads
[Java] -Schnittstelle
Was ist java
Was ich gelernt habe
Über die Java-Klasse
Informationen zu Java-Arrays
Über Java-Vererbung
Über Schnittstelle, Java-Schnittstelle
Was ich aus der Java-Geldberechnung gelernt habe
Über Java Var
Über Java Literal
Informationen zu Java-Befehlen
Woran ich dachte, als ich anfing, von Java nach Kotlin zu migrieren
Zusammenfassung dessen, was ich über Spring Boot gelernt habe
[Java] Was soll ich zum Schreiben von Dateien verwenden?
Was ich in Java gelernt habe (Teil 2) Was sind Variablen?
Was ich getan habe, als ich Java zu Kotlin konvertiert habe
Informationen zur Java-Protokollausgabe
Informationen zur Java-Funktionsschnittstelle
Java, über zweidimensionales Array
Über die Klassenteilung (Java)
Über [Java] [StreamAPI] allMatch ()
Informationen zur Java StringBuilder-Klasse
Ich habe zuerst Java touched berührt
[Java] Über Singleton Class
Ich habe zuerst Java touched berührt
Informationen zur Bindung von Java-Methoden
Ich habe zuerst Java touched berührt
[Java] Über anonyme Klassen
Informationen zu Aufteilungsmethoden (Java)
Was ist Java-Kapselung?
[Java Silver] Informationen zur Initialisierung
Was ich gelernt habe ② ~ Mock ~
Informationen zur Java-Array-Liste
Über Java-Polymorphismus super ()
Was ich gelernt habe ~ ~ DJUnit ~
Informationen zur Vererbung (Java Silver)
Informationen zur Java String-Klasse
Informationen zu Java-Zugriffsmodifikatoren
Über Java-Lambda-Ausdrücke
Was ist Java-Technologie?
Ich habe zuerst Java berührt