Java 8: Uitgebreide Quick Reference Gids
Java 8 - Overzicht
JAVA 8 is een grote feature release van de JAVA programmeertaal. De initiële versie werd uitgebracht op 18 maart 2014. Met de Java 8 release biedt Java ondersteuning voor functioneel programmeren, nieuwe JavaScript-engine, nieuwe API's voor datum/tijd manipulatie, nieuwe streaming API, etc.
Nieuwe Functies
Lambda expressie − Voegt functionele verwerkingscapaciteit toe aan Java.
Methode referenties − Functies refereren aan hun namen in plaats van ze direct aan te roepen. Functies als parameter gebruiken.
Default methode − Interface om standaard methode-implementatie te hebben.
Nieuwe tools − Nieuwe compiler tools en utilities worden toegevoegd zoals 'jdeps' om afhankelijkheden te ontdekken.
Stream API − Nieuwe stream API om pijpleidingverwerking te faciliteren.
Date Time API − Verbeterde datum/tijd API.
Optional − Nadruk op best practices om null-waarden correct te hanteren.
Nashorn, JavaScript Engine − Een Java-gebaseerde engine om JavaScript-code uit te voeren.
Overweeg de volgende code snippet.
Live Demoimport java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
public class Java8Tester {
public static void main(String args[]) {
List<String> names1 = new ArrayList<String>();
names1.add("Mahesh ");
names1.add("Suresh ");
names1.add("Ramesh ");
names1.add("Naresh ");
names1.add("Kalpesh ");
List<String> names2 = new ArrayList<String>();
names2.add("Mahesh ");
names2.add("Suresh ");
names2.add("Ramesh ");
names2.add("Naresh ");
names2.add("Kalpesh ");
Java8Tester tester = new Java8Tester();
System.out.println("Sorteren met Java 7 syntax: ");
tester.sortUsingJava7(names1);
System.out.println(names1);
System.out.println("Sorteren met Java 8 syntax: ");
tester.sortUsingJava8(names2);
System.out.println(names2);
}
// sorteren met java 7
private void sortUsingJava7(List<String> names) {
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
}
// sorteren met java 8
private void sortUsingJava8(List<String> names) {
Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
}
}
Voer het programma uit om het volgende resultaat te krijgen.
Sorteren met Java 7 syntax: [ Kalpesh Mahesh Naresh Ramesh Suresh ] Sorteren met Java 8 syntax: [ Kalpesh Mahesh Naresh Ramesh Suresh ]
Hier gebruikt de sortUsingJava8() methode de sort-functie met een lambda-expressie als parameter om de sorteercriteria te krijgen.
Java 8 - Omgeving Instellen
Lokale Omgeving Instellen
Als je je eigen omgeving wilt instellen voor de Java programmeertaal, dan begeleidt deze sectie je door het hele proces. Volg de onderstaande stappen om je Java-omgeving in te stellen.
Java SE kan gratis gedownload worden via de volgende link:
https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
Je downloadt een versie gebaseerd op je besturingssysteem.
Volg de instructies om Java te downloaden, en voer het .exe bestand uit om Java op je machine te installeren. Eenmaal geïnstalleerd, moet je omgevingsvariabelen instellen om naar de juiste installatiemappen te wijzen.
Pad Instellen voor Windows 2000/XP
Ervan uitgaande dat je Java hebt geïnstalleerd in c:\Program Files\java\jdk map:
Rechtsklik op 'Mijn Computer' en selecteer 'Eigenschappen'.
Klik op de knop 'Omgevingsvariabelen' onder het tabblad 'Geavanceerd'.
Wijzig nu de 'Path' variabele zodat deze ook het pad naar de Java executable bevat. Bijvoorbeeld, als het pad momenteel ingesteld is op 'C:\WINDOWS\SYSTEM32', verander het dan in 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'.
Pad Instellen voor Windows 95/98/ME
Ervan uitgaande dat je Java hebt geïnstalleerd in c:\Program Files\java\jdk map:
Bewerk het 'C:\autoexec.bat' bestand en voeg de volgende regel aan het einde toe:
SET PATH=%PATH%;C:\Program Files\java\jdk\bin
Pad Instellen voor Linux, UNIX, Solaris, FreeBSD
Omgevingsvariabele PATH moet ingesteld worden om te wijzen naar waar de Java-binaries geïnstalleerd zijn. Raadpleeg je shell-documentatie als je hier moeite mee hebt.
Bijvoorbeeld, als je bash als je shell gebruikt, voeg dan de volgende regel aan het einde van je '.bashrc' toe: export PATH=/path/to/java:$PATH
Populaire Java Editors
Om Java-programma's te schrijven, heb je een teksteditor nodig. Er zijn nog meer gesofisticeerde IDE's beschikbaar op de mark. Maar voor nu kun je een van de volgende overwegen:
Notepad − Op Windows-machine kun je elke eenvoudige teksteditor gebruiken zoals Notepad (aanbevolen voor deze tutorial) of TextPad.
Netbeans − Het is een Java IDE dat open-source en gratis is. Het kan gedownload worden van https://netbeans.org/index.html.
Eclipse − Het is ook een Java IDE ontwikkeld door de Eclipse open-source community en kan gedownload worden van https://www.eclipse.org/.
Java 8 - Lambda Expressies
Lambda-expressies zijn geïntroduceerd in Java 8 en worden geprezen als de grootste functie van Java 8. Lambda-expressies faciliteren functioneel programmeren en vereenvoudigen de ontwikkeling enorm.
Syntax
Een lambda-expressie wordt gekenmerkt door de volgende syntax.
parameter -> expressie body
Hieronder volgen de belangrijke kenmerken van een lambda-expressie.
Optionele type declaratie − Geen noodzaak om het type van een parameter te declareren. De compiler kan dit afleiden uit de waarde van de parameter.
Optionele haakjes rond parameter − Geen noodzaak om een enkele parameter in haakjes te zetten. Voor meerdere parameters zijn haakjes vereist.
Optionele accolades − Geen noodzaak om accolades te gebruiken in de expressie-body als de body een enkele statement bevat.
Optioneel return trefwoord − De compiler retourneert automatisch de waarde als de body een enkele expressie heeft om de waarde terug te geven. Accolades zijn vereist om aan te geven dat de expressie een waarde retourneert.
Lambda Expressies Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demopublic class Java8Tester {
public static void main(String args[]) {
Java8Tester tester = new Java8Tester();
// met type declaratie
MathOperation addition = (int a, int b) -> a + b;
// zonder type declaratie
MathOperation subtraction = (a, b) -> a - b;
// met return statement samen met accolades
MathOperation multiplication = (int a, int b) -> { return a * b; };
// zonder return statement en zonder accolades
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
// zonder haakjes
GreetingService greetService1 = message -> System.out.println("Hallo " + message);
// met haakjes
GreetingService greetService2 = (message) -> System.out.println("Hallo " + message);
greetService1.sayMessage("Mahesh");
greetService2.sayMessage("Suresh");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation) {
return mathOperation.operation(a, b);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hallo Mahesh Hallo Suresh
Hieronder volgen de belangrijke punten die in het bovenstaande voorbeeld overwogen moeten worden.
Lambda-expressies worden primair gebruikt om inline implementatie van een functioneel interface te definiëren, d.w.z. een interface met slechts één methode. In het bovenstaande voorbeeld hebben we verschillende typen lambda-expressies gebruikt om de operation-methode van de MathOperation-interface te definiëren. Vervolgens hebben we de implementatie van sayMessage van GreetingService gedefinieerd.
Lambda-expressie elimineert de noodzaak voor anonieme klassen en geeft een zeer eenvoudige maar krachtige functionele programmeercapaciteit aan Java.
Scope
Met lambda-expressie kun je naar elke finale variabele of effectief finale variabele (die slechts één keer wordt toegewezen) verwijzen. Lambda-expressie gooit een compilatiefout als een variabele een tweede keer een waarde krijgt toegewezen.
Scope Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demopublic class Java8Tester {
final static String salutation = "Hallo! ";
public static void main(String args[]) {
GreetingService greetService1 = message -> System.out.println(salutation + message);
greetService1.sayMessage("Mahesh");
}
interface GreetingService {
void sayMessage(String message);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Hallo! Mahesh
Java 8 - Methode Referenties
Methode referenties helpen om naar methoden te wijzen via hun namen. Een methode referentie wordt beschreven met het "::" symbool. Een methode referentie kan gebruikt worden om naar de volgende typen methoden te wijzen:
- Statische methoden
- Instantie methoden
- Constructors met new operator (TreeSet::new)
Methode Referentie Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
import java.util.List;
import java.util.ArrayList;
public class Java8Tester {
public static void main(String args[]) {
List names = new ArrayList();
names.add("Mahesh");
names.add("Suresh");
names.add("Ramesh");
names.add("Naresh");
names.add("Kalpesh");
names.forEach(System.out::println);
}
}
Hier hebben we System.out::println methode doorgegeven als een statische methode referentie.
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Mahesh Suresh Ramesh Naresh Kalpesh
Java 8 - Functionele Interfaces
Functionele interfaces hebben een enkele functionaliteit om te tonen. Bijvoorbeeld, een Comparable-interface met een enkele methode 'compareTo' wordt gebruikt voor vergelijkingsdoeleinden. Java 8 heeft veel functionele interfaces gedefinieerd die uitgebreid gebruikt worden in lambda-expressies. Hieronder volgt de lijst met functionele interfaces gedefinieerd in java.util.Function pakket.
| Nr. | Interface & Beschrijving |
|---|---|
| 1 | BiConsumer<T,U> Vertegenwoordigt een operatie die twee invoerargumenten accepteert en geen resultaat retourneert. |
| 2 | BiFunction<T,U,R> Vertegenwoordigt een functie die twee argumenten accepteert en een resultaat produceert. |
| 3 | BinaryOperator<T> Vertegenwoordigt een operatie op twee operanden van hetzelfde type, die een resultaat van hetzelfde type produceert als de operanden. |
| 4 | BiPredicate<T,U> Vertegenwoordigt een predicaat (Booleaans-gewichte functie) van twee argumenten. |
| 5 | BooleanSupplier Vertegenwoordigt een leverancier van Booleaans-gewichte resultaten. |
| 6 | Consumer<T> Vertegenwoordigt een operatie die een enkel invoerargument accepteert en geen resultaat retourneert. |
| 7 | DoubleBinaryOperator Vertegenwoordigt een operatie op twee double-gewichte operanden en produceert een double-gewichtsresultaat. |
| 8 | DoubleConsumer Vertegenwoordigt een operatie die een enkel double-gewichtsargument accepteert en geen resultaat retourneert. |
| 9 | DoubleFunction<R> Vertegenwoordigt een functie die een double-gewichtsargument accepteert en een resultaat produceert. |
| 10 | DoublePredicate Vertegenwoordigt een predicaat (Booleaans-gewichte functie) van één double-gewichtsargument. |
| 11 | DoubleSupplier Vertegenwoordigt een leverancier van double-gewichtsresultaten. |
| 12 | DoubleToIntFunction Vertegenwoordigt een functie die een double-gewichtsargument accepteert en een int-gewichtsresultaat produceert. |
| 13 | DoubleToLongFunction Vertegenwoordigt een functie die een double-gewichtsargument accepteert en een long-gewichtsresultaat produceert. |
| 14 | DoubleUnaryOperator Vertegenwoordigt een operatie op een enkel double-gewichtsoperand die een double-gewichtsresultaat produceert. |
| 15 | Function<T,R> Vertegenwoordigt een functie die één argument accepteert en een resultaat produceert. |
| 16 | IntBinaryOperator Vertegenwoordigt een operatie op twee int-gewichtsoperanden en produceert een int-gewichtsresultaat. |
| 17 | IntConsumer Vertegenwoordigt een operatie die een enkel int-gewichtsargument accepteert en geen resultaat retourneert. |
| 18 | IntFunction<R> Vertegenwoordigt een functie die een int-gewichtsargument accepteert en een resultaat produceert. |
| 19 | IntPredicate Vertegenwoordigt een predicaat (Booleaans-gewichte functie) van één int-gewichtsargument. |
| 20 | IntSupplier Vertegenwoordigt een leverancier van int-gewichtsresultaten. |
| 21 | IntToDoubleFunction Vertegenwoordigt een functie die een int-gewichtsargument accepteert en een double-gewichtsresultaat produceert. |
| 22 | IntToLongFunction Vertegenwoordigt een functie die een int-gewichtsargument accepteert en een long-gewichtsresultaat produceert. |
| 23 | IntUnaryOperator Vertegenwoordigt een operatie op een enkel int-gewichtsoperand die een int-gewichtsresultaat produceert. |
| 24 | LongBinaryOperator Vertegenwoordigt een operatie op twee long-gewichtsoperanden en produceert een long-gewichtsresultaat. |
| 25 | LongConsumer Vertegenwoordigt een operatie die een enkel long-gewichtsargument accepteert en geen resultaat retourneert. |
| 26 | LongFunction<R> Vertegenwoordigt een functie die een long-gewichtsargument accepteert en een resultaat produceert. |
| 27 | LongPredicate Vertegenwoordigt een predicaat (Booleaans-gewichte functie) van één long-gewichtsargument. |
| 28 | LongSupplier Vertegenwoordigt een leverancier van long-gewichtsresultaten. |
| 29 | LongToDoubleFunction Vertegenwoordigt een functie die een long-gewichtsargument accepteert en een double-gewichtsresultaat produceert. |
| 30 | LongToIntFunction Vertegenwoordigt een functie die een long-gewichtsargument accepteert en een int-gewichtsresultaat produceert. |
| 31 | LongUnaryOperator Vertegenwoordigt een operatie op een enkel long-gewichtsoperand die een long-gewichtsresultaat produceert. |
| 32 | ObjDoubleConsumer<T> Vertegenwoordigt een operatie die een object-gewichts- en een double-gewichtsargument accepteert, en geen resultaat retourneert. |
| 33 | ObjIntConsumer<T> Vertegenwoordigt een operatie die een object-gewichts- en een int-gewichtsargument accepteert, en geen resultaat retourneert. |
| 34 | ObjLongConsumer<T> Vertegenwoordigt een operatie die een object-gewichts- en een long-gewichtsargument accepteert, en geen resultaat retourneert. |
| 35 | Predicate<T> Vertegenwoordigt een predicaat (Booleaans-gewichte functie) van één argument. |
| 36 | Supplier<T> Vertegenwoordigt een leverancier van resultaten. |
| 37 | ToDoubleBiFunction<T,U> Vertegenwoordigt een functie die twee argumenten accepteert en een double-gewichtsresultaat produceert. |
| 38 | ToDoubleFunction<T> Vertegenwoordigt een functie die een double-gewichtsresultaat produceert. |
| 39 | ToIntBiFunction<T,U> Vertegenwoordigt een functie die twee argumenten accepteert en een int-gewichtsresultaat produceert. |
| 40 | ToIntFunction<T> Vertegenwoordigt een functie die een int-gewichtsresultaat produceert. |
| 41 | ToLongBiFunction<T,U> Vertegenwoordigt een functie die twee argumenten accepteert en een long-gewichtsresultaat produceert. |
| 42 | ToLongFunction<T> Vertegenwoordigt een functie die een long-gewichtsresultaat produceert. |
| 43 | UnaryOperator<T> Vertegenwoordigt een operatie op een enkel operand die een resultaat produceert van hetzelfde type als zijn operand. |
Functionele Interface Voorbeeld
Predicate <T> interface is een functionele interface met een methode test(Object) om een Booleaanse waarde terug te geven. Deze interface betekent dat een object getest wordt om true of false te zijn.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Java8Tester {
public static void main(String args[]) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
// Predicate<Integer> predicate = n -> true
// n wordt als parameter doorgegeven aan test methode van Predicate interface
// test methode zal altijd true retourneren ongeacht welke waarde n heeft.
System.out.println("Print alle getallen:");
// geef n als parameter door
eval(list, n -> true);
// Predicate<Integer> predicate1 = n -> n%2 == 0
// n wordt als parameter doorgegeven aan test methode van Predicate interface
// test methode zal true retourneren als n%2 nul wordt
System.out.println("Print even getallen:");
eval(list, n -> n % 2 == 0);
// Predicate<Integer> predicate2 = n -> n > 3
// n wordt als parameter doorgegeven aan test methode van Predicate interface
// test methode zal true retourneren als n groter is dan 3.
System.out.println("Print getallen groter dan 3:");
eval(list, n -> n > 3);
}
public static void eval(List<Integer> list, Predicate<Integer> predicate) {
for (Integer n : list) {
if (predicate.test(n)) {
System.out.println(n + " ");
}
}
}
}
Hier hebben we de Predicate-interface doorgegeven, die een enkele invoer neemt en een Booleaanse waarde retourneert.
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Print alle getallen: 1 2 3 4 5 6 7 8 9 Print even getallen: 2 4 6 8 Print getallen groter dan 3: 4 5 6 7 8 9
Java 8 - Default Methodes
Java 8 introduceert een nieuw concept van standaard methode-implementatie in interfaces. Deze capaciteit wordt toegevoegd voor backward compatibiliteit, zodat oude interfaces gebruikt kunnen worden om de lambda-expressie capaciteit van Java 8 te benutten.
Bijvoorbeeld, 'List' of 'Collection' interfaces hebben geen 'forEach' methode declaratie. Het toevoegen van zo'n methode zou de collection framework implementaties breken. Java 8 introduceert default methode zodat List/Collection interface een standaard implementatie van forEach methode kan hebben, en de klasse die deze interfaces implementeert hoeft deze niet te implementeren.
Syntax
public interface vehicle {
default void print() {
System.out.println("Ik ben een voertuig!");
}
}
Meerdere Defaults
Met default functies in interfaces, is er de mogelijkheid dat een klasse twee interfaces implementeert met dezelfde default methoden. De volgende code legt uit hoe deze ambiguïteit opgelost kan worden.
public interface vehicle {
default void print() {
System.out.println("Ik ben een voertuig!");
}
}
public interface fourWheeler {
default void print() {
System.out.println("Ik ben een vierwieler!");
}
}
Eerste oplossing is om een eigen methode te maken die de standaard implementatie overschrijft.
public class car implements vehicle, fourWheeler {
public void print() {
System.out.println("Ik ben een vierwieler auto voertuig!");
}
}
Tweede oplossing is om de default methode van de gespecifieerde interface aan te roepen met super.
public class car implements vehicle, fourWheeler {
public void print() {
vehicle.super.print();
}
}
Statische Default Methodes
Een interface kan vanaf Java 8 ook statische helper methoden hebben.
public interface vehicle {
default void print() {
System.out.println("Ik ben een voertuig!");
}
static void blowHorn() {
System.out.println("Hoor knallen!!!");
}
}
Default Methode Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demopublic class Java8Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
}
}
interface Vehicle {
default void print() {
System.out.println("Ik ben een voertuig!");
}
static void blowHorn() {
System.out.println("Hoor knallen!!!");
}
}
interface FourWheeler {
default void print() {
System.out.println("Ik ben een vierwieler!");
}
}
class Car implements Vehicle, FourWheeler {
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("Ik ben een auto!");
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Ik ben een voertuig! Ik ben een vierwieler! Hoor knallen!!! Ik ben een auto!
Java 8 - Streams
Stream is een nieuwe abstracte laag geïntroduceerd in Java 8. Met stream kun je data op een declaratieve manier verwerken, vergelijkbaar met SQL-statements. Overweeg bijvoorbeeld de volgende SQL-statement.
SELECT max(salary), employee_id, employee_name FROM Employee
De bovenstaande SQL-expressie retourneert automatisch de details van de hoogst gesalariseerde werknemer, zonder enige berekening aan de kant van de ontwikkelaar. Met collections framework in Java, moet een ontwikkelaar lussen gebruiken en herhaalde controles uitvoeren. Een ander punt is efficiëntie; aangezien multi-core processoren gemakkelijk beschikbaar zijn, moet een Java-ontwikkelaar parallelle code verwerken schrijven wat foutgevoelig kan zijn.
Om dergelijke problemen op te lossen, introduceert Java 8 het concept van stream waarmee de ontwikkelaar data declaratief kan verwerken en multicore-architectuur kan benutten zonder specifieke code hiervoor te schrijven.
Wat is een Stream?
Stream vertegenwoordigt een sequentie van objecten uit een bron, die aggregate operaties ondersteunt. Hieronder volgen de kenmerken van een Stream:
Sequentie van elementen − Een stream biedt een set elementen van een specifiek type in een sequentiële manier. Een stream haalt/berekent elementen op aanvraag. Het slaat de elementen nooit op.
Bron − Stream neemt Collections, Arrays, of I/O resources als invoerbron.
Aggregate operaties − Stream ondersteunt aggregate operaties zoals filter, map, limit, reduce, find, match, enz.
Pipelining − De meeste stream-operaties retourneren de stream zelf zodat hun resultaat gepijplined kan worden. Deze operaties heten intermediaire operaties en hun functie is om invoer te nemen, ze te verwerken, en output terug te geven aan het doel. collect() methode is een terminale operatie die normaal aan het einde van de pipelining operatie staat om het einde van de stream te markeren.
Automatische iteraties − Stream-operaties voeren de iteraties intern uit over de bron-elementen die worden geleverd, in tegenstelling tot Collections waar expliciete iteratie vereist is.
Streams Genereren
Met Java 8 heeft de Collection-interface twee methoden om een Stream te genereren.
stream() − Retourneert een sequentiële stream met de collection als bron.
parallelStream() − Retourneert een parallelle Stream met de collection als bron.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
forEach
Stream heeft een nieuwe methode 'forEach' geboden om elk element van de stream te itereren. Het volgende codesegment laat zien hoe 10 willekeurige getallen te printen met forEach.
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
map
De 'map' methode wordt gebruikt om elk element af te beelden op het bijbehorende resultaat. Het volgende codesegment print unieke kwadraten van getallen met map.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // krijg lijst van unieke kwadraten List<Integer> squaresList = numbers.stream().map(i -> i*i).distinct().collect(Collectors.toList());
filter
De 'filter' methode wordt gebruikt om elementen te elimineren op basis van een criterium. Het volgende codesegment print een telling van lege strings met filter.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// krijg telling van lege string
int count = strings.stream().filter(string -> string.isEmpty()).count();
limit
De 'limit' methode wordt gebruikt om de grootte van de stream te reduceren. Het volgende codesegment laat zien hoe 10 willekeurige getallen te printen met limit.
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
sorted
De 'sorted' methode wordt gebruikt om de stream te sorteren. Het volgende codesegment laat zien hoe 10 willekeurige getallen in gesorteerde volgorde te printen.
Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);
Parallelle Verwerking
parallelStream is de alternatief van stream voor parallelle verwerking. Kijk naar het volgende codesegment dat een telling van lege strings print met parallelStream.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// krijg telling van lege string
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
Het is heel gemakkelijk om te schakelen tussen sequentiële en parallelle streams.
Collectors
Collectors worden gebruikt om het resultaat van verwerking op de elementen van een stream te combineren. Collectors kunnen gebruikt worden om een lijst of een string terug te geven.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("Gefilterde Lijst: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("Samengevoegde String: " + mergedString);
Statistieken
Met Java 8 worden statistieken-collectors geïntroduceerd om alle statistieken te berekenen tijdens stream-verwerking.
List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("Hoogste getal in Lijst : " + stats.getMax());
System.out.println("Laagste getal in Lijst : " + stats.getMin());
System.out.println("Som van alle getallen : " + stats.getSum());
System.out.println("Gemiddelde van alle getallen : " + stats.getAverage());
Stream Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.Map;
public class Java8Tester {
public static void main(String args[]) {
System.out.println("Met Java 7: ");
// Tel lege strings
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
System.out.println("Lijst: " + strings);
long count = getCountEmptyStringUsingJava7(strings);
System.out.println("Lege Strings: " + count);
count = getCountLength3UsingJava7(strings);
System.out.println("Strings van lengte 3: " + count);
// Elimineer lege string
List<String> filtered = deleteEmptyStringsUsingJava7(strings);
System.out.println("Gefilterde Lijst: " + filtered);
// Elimineer lege string en join met komma.
String mergedString = getMergedStringUsingJava7(strings, ", ");
System.out.println("Samengevoegde String: " + mergedString);
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// krijg lijst van kwadraten van distincte getallen
List<Integer> squaresList = getSquares(numbers);
System.out.println("Kwadraten Lijst: " + squaresList);
List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
System.out.println("Lijst: " + integers);
System.out.println("Hoogste getal in Lijst : " + getMax(integers));
System.out.println("Laagste getal in Lijst : " + getMin(integers));
System.out.println("Som van alle getallen : " + getSum(integers));
System.out.println("Gemiddelde van alle getallen : " + getAverage(integers));
System.out.println("Willekeurige Getallen: ");
// print tien willekeurige getallen
Random random = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(random.nextInt());
}
System.out.println("Met Java 8: ");
System.out.println("Lijst: " + strings);
count = strings.stream().filter(string -> string.isEmpty()).count();
System.out.println("Lege Strings: " + count);
count = strings.stream().filter(string -> string.length() == 3).count();
System.out.println("Strings van lengte 3: " + count);
filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("Gefilterde Lijst: " + filtered);
mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("Samengevoegde String: " + mergedString);
squaresList = numbers.stream().map(i -> i*i).distinct().collect(Collectors.toList());
System.out.println("Kwadraten Lijst: " + squaresList);
System.out.println("Lijst: " + integers);
IntSummaryStatistics stats = integers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("Hoogste getal in Lijst : " + stats.getMax());
System.out.println("Laagste getal in Lijst : " + stats.getMin());
System.out.println("Som van alle getallen : " + stats.getSum());
System.out.println("Gemiddelde van alle getallen : " + stats.getAverage());
System.out.println("Willekeurige Getallen: ");
random.ints().limit(10).sorted().forEach(System.out::println);
// parallelle verwerking
count = strings.parallelStream().filter(string -> string.isEmpty()).count();
System.out.println("Lege Strings: " + count);
}
private static int getCountEmptyStringUsingJava7(List<String> strings) {
int count = 0;
for (String string : strings) {
if (string.isEmpty()) {
count++;
}
}
return count;
}
private static int getCountLength3UsingJava7(List<String> strings) {
int count = 0;
for (String string : strings) {
if (string.length() == 3) {
count++;
}
}
return count;
}
private static List<String> deleteEmptyStringsUsingJava7(List<String> strings) {
List<String> filteredList = new ArrayList<String>();
for (String string : strings) {
if (!string.isEmpty()) {
filteredList.add(string);
}
}
return filteredList;
}
private static String getMergedStringUsingJava7(List<String> strings, String separator) {
StringBuilder stringBuilder = new StringBuilder();
for (String string : strings) {
if (!string.isEmpty()) {
stringBuilder.append(string);
stringBuilder.append(separator);
}
}
String mergedString = stringBuilder.toString();
return mergedString.substring(0, mergedString.length() - 2);
}
private static List<Integer> getSquares(List<Integer> numbers) {
List<Integer> squaresList = new ArrayList<Integer>();
for (Integer number : numbers) {
Integer square = new Integer(number.intValue() * number.intValue());
if (!squaresList.contains(square)) {
squaresList.add(square);
}
}
return squaresList;
}
private static int getMax(List<Integer> numbers) {
int max = numbers.get(0);
for (int i = 1; i < numbers.size(); i++) {
Integer number = numbers.get(i);
if (number.intValue() > max) {
max = number.intValue();
}
}
return max;
}
private static int getMin(List<Integer> numbers) {
int min = numbers.get(0);
for (int i = 1; i < numbers.size(); i++) {
Integer number = numbers.get(i);
if (number.intValue() < min) {
min = number.intValue();
}
}
return min;
}
private static int getSum(List numbers) {
int sum = (int) (numbers.get(0));
for (int i = 1; i < numbers.size(); i++) {
sum += (int) numbers.get(i);
}
return sum;
}
private static int getAverage(List<Integer> numbers) {
return getSum(numbers) / numbers.size();
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten produceren:
Met Java 7: Lijst: [abc, , bc, efg, abcd, , jkl] Lege Strings: 2 Strings van lengte 3: 3 Gefilterde Lijst: [abc, bc, efg, abcd, jkl] Samengevoegde String: abc, bc, efg, abcd, jkl Kwadraten Lijst: [9, 4, 49, 25] Lijst: [1, 2, 13, 4, 15, 6, 17, 8, 19] Hoogste getal in Lijst : 19 Laagste getal in Lijst : 1 Som van alle getallen : 85 Gemiddelde van alle getallen : 9 Willekeurige Getallen: -1279735475 903418352 -1133928044 -1571118911 628530462 18407523 -881538250 -718932165 270259229 421676854 Met Java 8: Lijst: [abc, , bc, efg, abcd, , jkl] Lege Strings: 2 Strings van lengte 3: 3 Gefilterde Lijst: [abc, bc, efg, abcd, jkl] Samengevoegde String: abc, bc, efg, abcd, jkl Kwadraten Lijst: [9, 4, 49, 25] Lijst: [1, 2, 13, 4, 15, 6, 17, 8, 19] Hoogste getal in Lijst : 19 Laagste getal in Lijst : 1 Som van alle getallen : 85 Gemiddelde van alle getallen : 9.444444444444445 Willekeurige Getallen: -1009474951 -551240647 -2484714 181614550 933444268 1227850416 1579250773 1627454872 1683033687 1798939493 Lege Strings: 2
Java 8 - Optional Klasse
Optional is een container-object dat gebruikt wordt om niet-null objecten te bevatten. Optional-object wordt gebruikt om null te vertegenwoordigen met afwezige waarde. Deze klasse heeft diverse hulpmethoden om code te faciliteren om waarden te hanteren als 'beschikbaar' of 'niet beschikbaar' in plaats van null-waarden te controleren. Het is geïntroduceerd in Java 8 en is vergelijkbaar met wat Optional is in Guava.
Klassedeclaratie
Hieronder volgt de declaratie voor java.util.Optional<T> klasse:
public final class Optional<T> extends Object
Klassemethoden
| Nr. | Methode & Beschrijving |
|---|---|
| 1 | static <T> Optional<T> empty() Geeft een lege Optional-instantie terug. |
| 2 | boolean equals(Object obj) Geeft aan of een ander object "gelijk is aan" deze Optional. |
| 3 | Optional<T> filter(Predicate<? super T> predicate) Als een waarde aanwezig is en de waarde voldoet aan een gegeven predicaat, retourneert het een Optional die de waarde beschrijft, anders retourneert het een lege Optional. |
| 4 | <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) Als een waarde aanwezig is, past het de meegeleverde Optional-dragende mapping-functie toe, retourneert dat resultaat, anders retourneert het een lege Optional. |
| 5 | T get() Als een waarde aanwezig is in deze Optional, retourneert de waarde, anders gooit NoSuchElementException. |
| 6 | int hashCode() Retourneert de hash-code waarde van de aanwezige waarde, indien aanwezig, of 0 (nul) als geen waarde aanwezig is. |
| 7 | void ifPresent(Consumer<? super T> consumer) Als een waarde aanwezig is, roept het de gespecifieerde consumer aan met de waarde, anders doet het niets. |
| 8 | boolean isPresent() Retourneert true als er een waarde aanwezig is, anders false. |
| 9 | <U> Optional<U> map(Function<? super T, ? extends U> mapper) Als een waarde aanwezig is, past het de meegeleverde mapping-functie toe, en als het resultaat niet-null is, retourneert het een Optional die het resultaat beschrijft. |
| 10 | static <T> Optional<T> of(T value) Retourneert een Optional met de gespecifieerde aanwezige niet-null waarde. |
| 11 | static <T> Optional<T> ofNullable(T value) Retourneert een Optional die de gespecifieerde waarde beschrijft, als niet-null, anders retourneert een lege Optional. |
| 12 | T orElse(T other) Retourneert de waarde als aanwezig, anders retourneert other. |
| 13 | T orElseGet(Supplier<? extends T> other) Retourneert de waarde als aanwezig, anders roept other aan en retourneert het resultaat van die aanroep. |
| 14 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) Retourneert de bevatwaarde, als aanwezig, anders gooit een exception die wordt aangemaakt door de meegeleverde supplier. |
| 15 | String toString() Retourneert een niet-lege stringrepresentatie van deze Optional geschikt voor debugging. |
Deze klasse overerft methoden van de volgende klasse:
- java.lang.Object
Optional Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.util.Optional;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - staat toe dat doorgegeven parameter null is.
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - gooit NullPointerException als doorgegeven parameter null is
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// Optional.isPresent - controleert of de waarde aanwezig is of niet
System.out.println("Eerste parameter is aanwezig: " + a.isPresent());
System.out.println("Tweede parameter is aanwezig: " + b.isPresent());
// Optional.orElse - retourneert de waarde als aanwezig, anders retourneert
// de standaardwaarde die is doorgegeven.
Integer value1 = a.orElse(new Integer(0));
// Optional.get - haalt de waarde op, waarde moet aanwezig zijn
Integer value2 = b.get();
return value1 + value2;
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Eerste parameter is aanwezig: false Tweede parameter is aanwezig: true 10
Java 8 - Nashorn JavaScript
Met Java 8 wordt Nashorn, een aanzienlijk verbeterde javascript-engine, geïntroduceerd om de bestaande Rhino te vervangen. Nashorn biedt 2 tot 10 keer betere prestaties, omdat het de code direct in het geheugen compileert en de bytecode aan de JVM doorgeeft. Nashorn gebruikt de invoke dynamics-functie, geïntroduceerd in Java 7, om de prestaties te verbeteren.
jjs
Voor de Nashorn-engine introduceert JAVA 8 een nieuw commandline-tool, jjs, om javascript-codes in de console uit te voeren.
JS-bestand Interpreteren
Maak en bewaar het bestand sample.js in c:\> JAVA map.
sample.js
print('Hello World!');
Open console en gebruik het volgende commando.
C:\JAVA>jjs sample.js
Het zal de volgende output produceren:
Hello World!
jjs in Interactieve Modus
Open de console en gebruik het volgende commando.
C:\JAVA>jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>
Argumenten Doorgeven
Open de console en gebruik het volgende commando.
C:\JAVA> jjs -- a b c
jjs> print('letters: ' + arguments.join(", "))
letters: a, b, c
jjs>
JavaScript Aanroepen vanuit Java
Met ScriptEngineManager kan JavaScript-code worden aangeroepen en geïnterpreteerd in Java.
Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
public class Java8Tester {
public static void main(String args[]) {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
String name = "Mahesh";
Integer result = null;
try {
nashorn.eval("print('" + name + "')");
result = (Integer) nashorn.eval("10 + 2");
} catch (ScriptException e) {
System.out.println("Fout bij uitvoeren script: " + e.getMessage());
}
System.out.println(result.toString());
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten produceren:
Mahesh 12
Java Aanroepen vanuit JavaScript
Het volgende voorbeeld legt uit hoe je Java-klassen in JavaScript kunt importeren en gebruiken.
Maak en bewaar sample.js in c:\> JAVA map.
sample.js
var BigDecimal = Java.type('java.math.BigDecimal');
function calculate(amount, percentage) {
var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide(
new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
return result.toPlainString();
}
var result = calculate(568000000000000000023, 13.9);
print(result);
Open de console en gebruik het volgende commando.
C:\JAVA>jjs sample.js
Het zou de volgende output moeten produceren:
78952000000000000003.20
Java 8 - Nieuwe Date/Time API
Met Java 8 wordt een nieuwe Date-Time API geïntroduceerd om de volgende tekortkomingen van de oude date-time API op te lossen.
Niet thread-safe − java.util.Date is niet thread-safe, dus ontwikkelaars moeten omgaan met gelijktijdigheidsproblemen bij het gebruik van datum. De nieuwe date-time API is immuteerbaar en heeft geen setter-methoden.
Slecht ontwerp − Standaard Date begint bij 1900, maand begint bij 1, en dag begint bij 0, dus geen uniformiteit. De oude API had minder directe methoden voor datumoperaties. De nieuwe API biedt talloze hulpmethoden voor dergelijke operaties.
Moeilijke tijdzone-afhandeling − Ontwikkelaars moesten veel code schrijven om om te gaan met timezone-kwesties. De nieuwe API is ontwikkeld met domeinspecifiek ontwerp in gedachten.
Java 8 introduceert een nieuwe date-time API onder het pakket java.time. Hieronder volgen enkele van de belangrijke klassen geïntroduceerd in java.time pakket.
Local − Vereenvoudigde date-time API zonder complexiteit van timezone-afhandeling.
Zoned − Gespecialiseerde date-time API om met diverse timezones om te gaan.
Local Date-Time API
LocalDate/LocalTime en LocalDateTime klassen vereenvoudigen de ontwikkeling waar timezones niet vereist zijn. Laten we ze in actie zien.
Maak het volgende java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Month;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testLocalDateTime();
}
public void testLocalDateTime() {
// Haal de huidige datum en tijd op
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("Huidige DateTime: " + currentTime);
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1: " + date1);
Month month = currentTime.getMonth();
int day = currentTime.getDayOfMonth();
int seconds = currentTime.getSecond();
System.out.println("Maand: " + month + " dag: " + day + " seconden: " + seconds);
LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
System.out.println("date2: " + date2);
// 12 december 2014
LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
System.out.println("date3: " + date3);
// 22 uur 15 minuten
LocalTime date4 = LocalTime.of(22, 15);
System.out.println("date4: " + date4);
// parse een string
LocalTime date5 = LocalTime.parse("20:15:30");
System.out.println("date5: " + date5);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Huidige DateTime: 2014-12-09T11:00:45.457 date1: 2014-12-09 Maand: DECEMBER dag: 9 seconden: 45 date2: 2012-12-10T11:00:45.457 date3: 2014-12-12 date4: 22:15 date5: 20:15:30
Zoned Date-Time API
Zoned date-time API wordt gebruikt wanneer tijdzone in aanmerking moet worden genomen. Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.ZonedDateTime;
import java.time.ZoneId;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testZonedDateTime();
}
public void testZonedDateTime() {
// Haal de huidige datum en tijd op
ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");
System.out.println("date1: " + date1);
ZoneId id = ZoneId.of("Europe/Paris");
System.out.println("ZoneId: " + id);
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("CurrentZone: " + currentZone);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
date1: 2007-12-03T10:15:30+05:00[Asia/Karachi] ZoneId: Europe/Paris CurrentZone: Etc/UTC
Chrono Units Enum
java.time.temporal.ChronoUnit enum is in Java 8 toegevoegd om de gehele waarden te vervangen die in de oude API werden gebruikt om dag, maand, etc. weer te geven. Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testChromoUnits();
}
public void testChromoUnits() {
// Haal de huidige datum op
LocalDate today = LocalDate.now();
System.out.println("Huidige datum: " + today);
// Voeg 1 week toe aan de huidige datum
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("Volgende week: " + nextWeek);
// Voeg 1 maand toe aan de huidige datum
LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);
System.out.println("Volgende maand: " + nextMonth);
// Voeg 1 jaar toe aan de huidige datum
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
System.out.println("Volgend jaar: " + nextYear);
// Voeg 10 jaar toe aan de huidige datum
LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES);
System.out.println("Datum over tien jaar: " + nextDecade);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten produceren:
Huidige datum: 2014-12-10 Volgende week: 2014-12-17 Volgende maand: 2015-01-10 Volgend jaar: 2015-12-10 Datum over tien jaar: 2024-12-10
Period en Duration
Met Java 8 worden twee gespecialiseerde klassen geïntroduceerd om met de tijdsverschillen om te gaan.
Period − Het gaat om datum-gebaseerde hoeveelheden tijd.
Duration − Het gaat om tijd-gebaseerde hoeveelheden tijd.
Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.temporal.ChronoUnit;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Duration;
import java.time.Period;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testPeriod();
java8tester.testDuration();
}
public void testPeriod() {
// Haal de huidige datum op
LocalDate date1 = LocalDate.now();
System.out.println("Huidige datum: " + date1);
// Voeg 1 maand toe aan de huidige datum
LocalDate date2 = date1.plus(1, ChronoUnit.MONTHS);
System.out.println("Volgende maand: " + date2);
Period period = Period.between(date2, date1);
System.out.println("Period: " + period);
}
public void testDuration() {
LocalTime time1 = LocalTime.now();
Duration twoHours = Duration.ofHours(2);
LocalTime time2 = time1.plus(twoHours);
Duration duration = Duration.between(time1, time2);
System.out.println("Duration: " + duration);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Huidige datum: 2014-12-10 Volgende maand: 2015-01-10 Period: P-1M Duration: PT2H
Temporal Adjusters
TemporalAdjuster wordt gebruikt om de datum-wiskunde uit te voeren. Bijvoorbeeld, haal de "Tweede zaterdag van de maand" op of "Volgende dinsdag". Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.time.DayOfWeek;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testAdjusters();
}
public void testAdjusters() {
// Haal de huidige datum op
LocalDate date1 = LocalDate.now();
System.out.println("Huidige datum: " + date1);
// Haal de volgende dinsdag op
LocalDate nextTuesday = date1.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
System.out.println("Volgende dinsdag op: " + nextTuesday);
// Haal de tweede zaterdag van de volgende maand op
LocalDate firstInYear = LocalDate.of(date1.getYear(), date1.getMonth(), 1);
LocalDate secondSaturday = firstInYear.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY))
.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
System.out.println("Tweede zaterdag op: " + secondSaturday);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten produceren:
Huidige datum: 2014-12-10 Volgende dinsdag op: 2014-12-16 Tweede zaterdag op: 2014-12-13
Backward Compatibiliteit
Een toInstant() methode is toegevoegd aan de oorspronkelijke Date en Calendar objecten, die gebruikt kan worden om ze te converteren naar de nieuwe Date-Time API. Gebruik een ofInstant(Instant, ZoneId) methode om een LocalDateTime of ZonedDateTime object te krijgen. Laten we ze in actie zien.
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8tester = new Java8Tester();
java8tester.testBackwardCompatability();
}
public void testBackwardCompatability() {
// Haal de huidige datum op
Date currentDate = new Date();
System.out.println("Huidige datum: " + currentDate);
// Haal het instant van de huidige datum op in termen van milliseconden
Instant now = currentDate.toInstant();
ZoneId currentZone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone);
System.out.println("Lokale datum: " + localDateTime);
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone);
System.out.println("Zoned datum: " + zonedDateTime);
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Huidige datum: Wed Dec 10 05:44:06 UTC 2014 Lokale datum: 2014-12-10T05:44:06.635 Zoned datum: 2014-12-10T05:44:06.635Z[Etc/UTC]
Java 8 - Base64
Met Java 8 heeft Base64 eindelijk de aandacht gekregen die het verdient. Java 8 heeft nu ingebouwde encoder en decoder voor Base64-encoding. In Java 8 kunnen we drie typen Base64-encoding gebruiken.
Simple − Output wordt gemapt op een set tekens in A-Za-z0-9+/. De encoder voegt geen line feed toe aan output, en de decoder verwijst elk teken af dat niet in A-Za-z0-9+/ valt.
URL − Output wordt gemapt op set tekens in A-Za-z0-9+_. Output is URL- en bestandsnaamveilig.
MIME − Output wordt gemapt op MIME-vriendelijk formaat. Output wordt weergegeven in regels van maximaal 76 tekens elk, en gebruikt een carriage return '\r' gevolgd door een linefeed '\n' als regel scheider. Geen regel scheider aan het einde van de gecodeerde output.
Geneste Klassen
| Nr. | Geneste Klasse & Beschrijving |
|---|---|
| 1 | static class Base64.Decoder Deze klasse implementeert een decoder voor het decoderen van bytedata met behulp van het Base64-encodingsschema zoals gespecificeerd in RFC 4648 en RFC 2045. |
| 2 | static class Base64.Encoder Deze klasse implementeert een encoder voor het coderen van bytedata met behulp van het Base64-encodingsschema zoals gespecificeerd in RFC 4648 en RFC 2045. |
Methoden
| Nr. | Methode Naam & Beschrijving |
|---|---|
| 1 | static Base64.Decoder getDecoder() Geeft een Base64.Decoder terug die decodeert met behulp van het Basic-type base64-encodingsschema. |
| 2 | static Base64.Encoder getEncoder() Geeft een Base64.Encoder terug die codeert met behulp van het Basic-type base64-encodingsschema. |
| 3 | static Base64.Decoder getMimeDecoder() Geeft een Base64.Decoder terug die decodeert met behulp van het MIME-type base64-decodingsschema. |
| 4 | static Base64.Encoder getMimeEncoder() Geeft een Base64.Encoder terug die codeert met behulp van het MIME-type base64-encodingsschema. |
| 5 | static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator) Geeft een Base64.Encoder terug die codeert met behulp van het MIME-type base64-encodingsschema met gespecificeerde regellengte en regelscheiders. |
| 6 | static Base64.Decoder getUrlDecoder() Geeft een Base64.Decoder terug die decodeert met behulp van het URL- en bestandsnaamveilige type base64-encodingsschema. |
| 7 | static Base64.Encoder getUrlEncoder() Geeft een Base64.Encoder terug die codeert met behulp van het URL- en bestandsnaamveilige type base64-encodingsschema. |
Overgeërfde Methoden
Deze klasse overerft methoden van de volgende klasse:
- java.lang.Object
Base64 Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:/> JAVA.
Java8Tester.java
Live Demoimport java.util.Base64;
import java.util.UUID;
import java.io.UnsupportedEncodingException;
public class HelloWorld {
public static void main(String args[]) {
try {
// Coderen met basis encoder
String base64encodedString = Base64.getEncoder().encodeToString(
"TutorialsPoint?java8".getBytes("utf-8"));
System.out.println("Base64 Gecodeerde String (Basic) :" + base64encodedString);
// Decoderen
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
System.out.println("Originele String: " + new String(base64decodedBytes, "utf-8"));
base64encodedString = Base64.getUrlEncoder().encodeToString(
"TutorialsPoint?java8".getBytes("utf-8"));
System.out.println("Base64 Gecodeerde String (URL) :" + base64encodedString);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println("Base64 Gecodeerde String (MIME) :" + mimeEncodedString);
} catch (UnsupportedEncodingException e) {
System.out.println("Fout :" + e.getMessage());
}
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Base64 Gecodeerde String (Basic) :VHV0b3JpYWxzUG9pbnQ/amF2YTg= Originele String: TutorialsPoint?java8 Base64 Gecodeerde String (URL) :VHV0b3JpYWxzUG9pbnQ_amF2YTg= Base64 Gecodeerde String (MIME) :YmU3NWY2ODktNGM5YS00ODlmLWI2MTUtZTVkOTk2YzQ1Njk1Y2EwZTg2OTEtMmRiZC00YTQ1LWJlNTctMTI1MWUwMTk0ZWQyNDE0NDAwYjgtYTYxOS00NDY5LTllYTctNjc1YzE3YWJhZTk1MTQ2MDQzNDItOTAyOC00ZWI0LThlOTYtZWU5YzcwNWQyYzVhMTQxMWRjYTMtY2MwNi00MzU0LTg0MTgtNGQ1MDkwYjdiMzg2ZTY0OWU5MmUtZmNkYS00YWEwLTg0MjQtYThiOTQxNDQ2YzhhNTVhYWExZjItNjU2Mi00YmM4LTk2ZGYtMDE4YmY5ZDZhMjkwMzM3MWUzNDMtMmQ3MS00MDczLWI0Y2UtMTQxODE0MGU5YjdmYTVlODUxYzItN2NmOS00N2UyLWIyODQtMThlMWVkYTY4M2Q1YjE3YTMyYmItZjllMS00MTFkLWJiM2UtM2JhYzUxYzI5OWI4
Java
- Preventief & Voorwaardegebaseerd Onderhoud Beheersen: Een Praktische PM Ontwikkelingsgids
- Expertgids voor vierkante buigmachines: van basis tot toepassing
- Koude persmachines: complete gids voor efficiënte metaalvorming
- Planeet tandwielkast uitgelegd: Compact, hoge koppel snelheidsreductie
- Jet Mill Drill: De Ultieme Professionele Gids
- Servo Pers Machines: Hoe Ze Werken & Hun Voordelen Ten Opzichte Van Mechanische Pressen
- Professionele Gids voor Pneumatische Cilinders: Snel & Betrouwbaar
- Tandwiel Deklamer Uitgelegd: Voordelen, Functies & Operaties
- Bescherm Uw Supply Chain: Uitgebreide Verzekeringsstrategieën
- CNC-Freesen Essentiëls: Snelle Referentiegids voor Professionele Operators
- Java Vector begrijpen: Gebruik, Kenmerken en Vergelijking met ArrayList