Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

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 Demo
import 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 Demo
public 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 Demo
public 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 Demo
import 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 Demo
public 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 Demo
import 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 Demo
import 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 Demo
import 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 Demo
import 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 Demo
import 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 Demo
import 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 Demo
import 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 Demo
import 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 Demo
import 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 Demo
import 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

  1. Preventief & Voorwaardegebaseerd Onderhoud Beheersen: Een Praktische PM Ontwikkelingsgids
  2. Expertgids voor vierkante buigmachines: van basis tot toepassing
  3. Koude persmachines: complete gids voor efficiënte metaalvorming
  4. Planeet tandwielkast uitgelegd: Compact, hoge koppel snelheidsreductie
  5. Jet Mill Drill: De Ultieme Professionele Gids
  6. Servo Pers Machines: Hoe Ze Werken & Hun Voordelen Ten Opzichte Van Mechanische Pressen
  7. Professionele Gids voor Pneumatische Cilinders: Snel & Betrouwbaar
  8. Tandwiel Deklamer Uitgelegd: Voordelen, Functies & Operaties
  9. Bescherm Uw Supply Chain: Uitgebreide Verzekeringsstrategieën
  10. CNC-Freesen Essentiëls: Snelle Referentiegids voor Professionele Operators
  11. Java Vector begrijpen: Gebruik, Kenmerken en Vergelijking met ArrayList