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".
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.
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éthode
print ()`,
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
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
JapaneseDate japaneseDate = JapaneseDate.now();
System.out.println(japaneseDate.getEra()); //"Heisei" est sorti
System.out.println(japaneseDate.get(ChronoField.YEAR_OF_ERA)); //"29" s'affiche
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
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
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
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");
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.
É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
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();
}
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
--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
Traitement pour affiner et modifier Steam et créer un nouveau Stream.
--Lors de la réduction des éléments
filter
, vous pouvez obtenir le Stream de l'élément spécifié uniquement.//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
distinct
.//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
map
.//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
Lorsque le processus de terminaison est exécuté, le processus intermédiaire est évalué.
--Si vous souhaitez obtenir le nombre d'éléments
count
.//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
forEach
.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
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