Ce que j'ai recherché sur Java 8

Aperçu

Pour mettre à jour la connaissance de Java qui s'est arrêtée à "1.4" J'apprends Java7,8,9. Cette fois, je ne décrirai que ce que j'ai étudié à propos des fonctions ajoutées en "8".

Ce que j'ai regardé

Optional Il est maintenant possible d'indiquer explicitement si la valeur de retour peut contenir null. Vous pouvez également définir la marche à suivre s'il n'y a pas de valeur lorsque vous la récupérez.

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

--ofNullable (valeur T): Générer facultatif. Si la valeur n'est pas nulle, un facultatif qui décrit la valeur est renvoyé, sinon un facultatif vide est renvoyé. --orElse (T autre): renvoie une valeur si elle existe, sinon renvoie autre.

Vous pouvez également vérifier l'existence d'une valeur en utilisant la méthode ʻisPresent () `.

Optional<String> gyunyu = getGyunyu("thé");
if (!gyunyu.isPresent()) {
  System.out.println("Pas de lait");
}

Dans ce cas, je pense que ce n'est pas très différent de ʻif (return value == null) `, mais s'il est nul, la valeur est reprise. Il semble qu'il puisse être utilisé lorsque vous souhaitez effectuer un traitement supplémentaire.

Classe facultative

interface l'interface peut maintenant avoir une implémentation. En écrivant le mot clé par défaut, vous pouvez écrire une méthode qui a une implémentation.

Gyunyu.java


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

Coffee.java


public class Coffee implements Gyunyu {
  //Je n'ai pas remplacé la méthode d'impression, mais je n'obtiens pas d'erreur de compilation
}
Gyunyu gyunyu = new Coffee();
gyunyu.print();

Créez une interface Milk qui hérite de l'interface Gyunyu et Si vous l'implémentez dans la classe ʻIchigoet appelez la méthodeprint ()`,

Milk.java


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

Ichigo.java


public class Ichigo implements Milk {
}
Gyunyu gyunyu = new Ichigo();
gyunyu.print(); //"Milk" est sorti

La méthode la plus proche de la classe appelant la méthode (dans ce cas, l'interface Milk print ()`) est exécutée.

Date and Time API

Obtenez la date et l'heure actuelles

Vous pouvez obtenir la date et l'heure actuelles en utilisant la méthode now ().

//Aucune information sur le fuseau horaire
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());
		
//Avec des informations sur le fuseau horaire
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" est sorti

Affichage dans le calendrier japonais

JapaneseDate japaneseDate = JapaneseDate.now();
System.out.println(japaneseDate.getEra()); //"Heisei" est sorti
System.out.println(japaneseDate.get(ChronoField.YEAR_OF_ERA)); //"29" s'affiche

Addition et soustraction

LocalDateTime localDateTime = LocalDateTime.now();

LocalDateTime tomorrow = localDateTime.plusDays(1);
System.out.println(tomorrow.getDayOfMonth()); //"30" est sorti lors de l'exécution le 29 novembre

LocalDateTime yesterday = localDateTime.minusDays(1);
System.out.println(yesterday.getDayOfMonth()); //"28" est sorti lors de l'exécution le 29 novembre

--Utilisez plus Years (longues années) si vous voulez ajouter des années --Si vous voulez soustraire des années, utilisez moins Années (longues années) --Pour d'autres ajouts et soustractions, classe LocalDateTime

Encodage / décodage Base64

Il est désormais pris en charge en standard.

String coffee = "café au lait";
		
Encoder encoder = Base64.getEncoder();
String encodeCoffee = encoder.encodeToString(coffee.getBytes());
System.out.println(encodeCoffee); //"44Kz44O844OS44O854mb5Lmz" est émis
		
Decoder decoder = Base64.getDecoder();
String decodeCoffee = new String(decoder.decode(encodeCoffee));
System.out.println(decodeCoffee); //"Café au lait" est sorti

Concaténation de chaînes

En utilisant String.join (), il est maintenant possible de joindre facilement plusieurs chaînes avec n'importe quelle chaîne.

String[] gyunyu = {"café au lait", "Lait Remon", "Lait de fraise"};
System.out.println(String.join("###", gyunyu)); //"café au lait###Lait Remon###Sortie avec "lait de fraise"
List<String> gyunyu = new ArrayList<>();
gyunyu.add("café au lait");
gyunyu.add("Lait Remon");
gyunyu.add("Lait de fraise");
System.out.println(String.join("###", gyunyu)); //"café au lait###Lait Remon###Sortie avec "lait de fraise"

Des jointures similaires peuvent être faites avec la classe java.util.StringJoiner.

StringJoiner gyunyu = new StringJoiner("###");
gyunyu.add("café au lait");
gyunyu.add("Lait Remon");
gyunyu.add("Lait de fraise");
System.out.println(gyunyu); //"café au lait###Lait Remon###Sortie avec "lait de fraise"

La classe StringJoiner peut également être jointe en spécifiant un préfixe et un suffixe.

StringJoiner gyunyu = new StringJoiner(" > ", "[Comme]", "[Haine]");
gyunyu.add("café au lait");
gyunyu.add("Lait Remon");
gyunyu.add("Lait de fraise");
System.out.println(gyunyu); //「[Comme]café au lait>Lait Remon>Lait de fraise[Haine]Est sortie

Style Lambda

Il est décrit dans la grammaire suivante.

(Arguments de méthode) -> {En traitement}

En utilisant l'expression lambda, il semble que le processus puisse être écrit de manière concise ... Quand il y a l'interface et le traitement suivants

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

En utilisant l'expression lambda, la description peut être la suivante.

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

De plus, le type d'argument est déduit et peut être omis. S'il n'y a qu'un seul argument, les parenthèses "()" peuvent également être omises. S'il n'y a qu'une seule expression, la parenthèse ondulée "{}" peut être omise, la description peut donc être la suivante.

Gyunyu gyunyu = v -> System.out.println(v);
gyunyu.output("café au lait");

Interface fonctionnelle

Une interface qui déclare une seule méthode abstraite. Si l'interface Gyunyu écrite dans l'expression lambda est transformée en interface fonctionnelle, La description est la suivante.

Gyunyu.java


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

En ajoutant l'annotation @ FunctionalInterface, il est possible d'indiquer explicitement qu'il s'agit d'une interface fonctionnelle. Il est possible d'émettre une erreur de compilation lorsque les conditions de l'interface fonctionnelle ne sont pas remplies.

Référence de la méthode

Étant donné que l'argument peut être omis de la référence de méthode, la quantité de description peut être réduite par rapport à l'expression lambda. Comment exécuter une méthode statique ou une méthode d'instance.

Nom de la classe (nom de l'instance) :: Nom de la méthode

Lors du référencement d'une méthode d'instance

Gyunyu gyunyu = System.out::println;
gyunyu.output("café au lait"); //「café au lait」と出力される

Si ce qui précède est décrit par une expression lambda, il peut être décrit comme suit.

Gyunyu gyunyu = v -> System.out.println(v);
gyunyu.output("café au lait");

Si la méthode à laquelle vous voulez vous référer est votre propre classe, utilisez this

Main.java


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

public void execute() {
  List<String> gyunyu = Arrays.asList("café au lait", "Lait de fraise", "Lait Remon");
  gyunyu.forEach(this::println);
}

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

Lors du référencement d'une méthode statique

Main.java


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

public static void main(String[] args) {
  List<String> gyunyu = Arrays.asList("café au lait", "Lait de fraise", "Lait Remon");
  gyunyu.forEach(Main::output);
}

Stream API Une API qui peut agréger des valeurs et effectuer un traitement à l'aide de données. Le flux de traitement de base est

  1. Génération de flux
  2. Traitement intermédiaire
  3. Processus de résiliation devenir de cette façon.

Génération de flux

--Pour les tableaux

String[] gyunyu1 = {"café au lait", "Café au lait", "Lait de fraise", "Lait de fraise", "Lait Remon", "Lait de citron"};
Stream<String> stream1 = Arrays.stream(gyunyu1);

String[] gyunyu2 = {"Lait de melon", "Lait de pomme", "Lait de melon", "Lait de raisin"};
Stream<String> stream2 = Stream.of(gyunyu2);

--Pour la collection

List<String> gyunyu3 = Arrays.asList("des fruits", "banane", "Suika");
Stream<String> stream3 = gyunyu3.stream();

--Pour la carte

Map<String, String> gyunyu4 = new HashMap<>();
gyunyu4.put("1", "Lait de cuisse");
gyunyu4.put("2", "Biwa");
gyunyu4.put("3", "Lait Ichijiku");
Stream<Entry<String, String>> stream4 = gyunyu4.entrySet().stream();

Référence: Stream generation

Fonctionnement intermédiaire

Traitement pour affiner et modifier Steam et créer un nouveau Stream.

--Lors de la réduction des éléments

//Je souhaite extraire uniquement les chaînes de caractères contenant du lait
String[] gyunyu1 = {"café au lait", "Café au lait", "Lait de fraise", "Lait de fraise", "Lait Remon", "Lait de citron"};
Stream<String> stream1 = Arrays.stream(gyunyu1);
stream1.filter(s -> s.contains("Lait"));

--Si vous souhaitez supprimer les éléments en double

//Je veux supprimer le lait en double
String[] gyunyu2 = {"Lait de melon", "Lait de pomme", "Lait de melon", "Lait de raisin"};
Stream<String> stream2 = Stream.of(gyunyu2);
stream2.distinct();

--Si vous souhaitez convertir des éléments

//Je veux ajouter du lait
List<String> gyunyu3 = Arrays.asList("des fruits", "banane", "Suika");
Stream<String> stream3 = gyunyu3.stream();
stream3.map(s -> s + "Lait");

Référence: Opération intermédiaire

Résiliation

Lorsque le processus de terminaison est exécuté, le processus intermédiaire est évalué.

--Si vous souhaitez obtenir le nombre d'éléments

//Je veux sortir le nombre de caisses, lait compris
Map<String, String> gyunyu4 = new HashMap<>();
gyunyu4.put("1", "Lait de cuisse");
gyunyu4.put("2", "Biwa");
gyunyu4.put("3", "Lait Ichijiku");
Stream<Entry<String, String>> stream4 = gyunyu4.entrySet().stream();
System.out.println(stream4.filter(s -> s.getValue().contains("Lait")).count()); //"2" est émis

--Lorsque vous souhaitez retirer des éléments un par un et les faire fonctionner

String[] gyunyu1 = {"café au lait", "Café au lait", "Lait de fraise", "Lait de fraise", "Lait Remon", "Lait de citron"};
Stream<String> stream1 = Arrays.stream(gyunyu1);
stream1.filter(s -> s.contains("Lait")).forEach(s -> System.out.println(s));

Référence: Traitement de la résiliation

À la fin

Puisque le service dont je suis en charge en entreprise fonctionne sur Java 5 et 6, je n'ai pas la possibilité d'utiliser 8 en entreprise, Je voudrais profiter de l'occasion pour le mettre à niveau. Je ne suis pas encore familier avec l'API Stream et les expressions lambda, je pense donc que j'ai besoin d'en savoir plus sur ces deux fonctionnalités.

Recommended Posts

Ce que j'ai recherché sur Java 8
Ce que j'ai recherché sur Java 6
Ce que j'ai recherché sur Java 9
Ce que j'ai recherché sur Java 7
Ce que j'ai recherché sur Java 5
Ce que j'ai recherché sur l'apprentissage Java
Ce que j'ai appris sur Kotlin
Ce que j'ai appris avec Java Gold
Ce que j'ai appris avec Java Silver
À propos de l'interface Java
[Java] À propos des fonctionnalités de Java 12
Qu'est-ce que 'java
[Java] À propos des tableaux
Prenez ce que vous avez appris sur la réflexion Java
Quelque chose à propos de java
Où est Java
À propos des fonctionnalités Java
Qu'est-ce que Java <>?
À propos des threads Java
Interface [Java]
Qu'est-ce que 'java
Ce que j'ai appris
À propos de la classe Java
À propos des tableaux Java
À propos de l'héritage Java
À propos de l'interface, interface java
Ce que j'ai appris du calcul monétaire Java
À propos de Java Var
À propos de Java Literal
À propos des commandes Java
Ce à quoi j'ai pensé lorsque j'ai commencé à migrer de Java vers Kotlin
Résumé de ce que j'ai appris sur Spring Boot
[Java] Que dois-je utiliser pour écrire des fichiers?
Ce que j'ai appris en Java (partie 2) Que sont les variables?
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
À propos de la sortie du journal Java
À propos de l'interface fonctionnelle Java
Java, à propos d'un tableau à deux dimensions
À propos de la division de classe (Java)
À propos de [Java] [StreamAPI] allMatch ()
À propos de la classe Java StringBuilder
J'ai d'abord touché Java ②
[Java] À propos de la classe Singleton
J'ai d'abord touché Java ③
À propos de la liaison de méthode Java
J'ai d'abord touché Java ④
[Java] À propos des classes anonymes
A propos des méthodes de fractionnement (Java)
Qu'est-ce que l'encapsulation Java?
[Java Silver] À propos de l'initialisation
Ce que j'ai appris ② ~ Mock ~
A propos de la liste des baies Java
À propos du polymorphisme Java Super ()
Ce que j'ai appris ① ~ DJUnit ~
À propos de l'héritage (Java Silver)
À propos de la classe Java String
À propos des modificateurs d'accès Java
À propos des expressions Java lambda
Qu'est-ce que la technologie Java?
J'ai d'abord touché Java