Java 8 - Beknopte handleiding
Java 8 - Overzicht
JAVA 8 is een belangrijke feature-release van JAVA-programmeertaalontwikkeling. De eerste versie werd uitgebracht op 18 maart 2014. Met de Java 8-release bood Java ondersteuning voor functioneel programmeren, een nieuwe JavaScript-engine, nieuwe API's voor datum-tijdmanipulatie, een nieuwe streaming-API, enz.
Nieuwe functies
-
Lambda-uitdrukking − Voegt functionele verwerkingscapaciteit toe aan Java.
-
Methodereferenties − Verwijzen naar functies op hun naam in plaats van ze rechtstreeks aan te roepen. Functies als parameter gebruiken.
-
Standaardmethode − Interface om standaardmethode-implementatie te hebben.
-
Nieuwe tools − Nieuwe compiler-tools en hulpprogramma's zijn toegevoegd zoals 'jdeps' om afhankelijkheden te achterhalen.
-
Stream-API − Nieuwe stream-API om pijplijnverwerking te vergemakkelijken.
-
Datum-tijd-API − Verbeterde datum-tijd-API.
-
Optioneel − Nadruk op best practices om correct om te gaan met null-waarden.
-
Nashorn, JavaScript-engine − Een op Java gebaseerde engine om JavaScript-code uit te voeren.
Overweeg het volgende codefragment.
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("Sort using Java 7 syntax: "); tester.sortUsingJava7(names1); System.out.println(names1); System.out.println("Sort using Java 8 syntax: "); tester.sortUsingJava8(names2); System.out.println(names2); } //sort using 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); } }); } //sort using 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.
Sort using Java 7 syntax: [ Kalpesh Mahesh Naresh Ramesh Suresh ] Sort using Java 8 syntax: [ Kalpesh Mahesh Naresh Ramesh Suresh ]
Hier de sortUsingJava8() methode gebruikt sorteerfunctie met een lambda-expressie als parameter om de sorteercriteria te krijgen.
Java 8 - Omgeving instellen
Lokale omgeving instellen
Als u uw eigen omgeving voor Java-programmeertaal wilt opzetten, dan leidt deze sectie u door het hele proces. Volg de onderstaande stappen om uw Java-omgeving in te stellen.
Java SE kan gratis worden gedownload via de volgende link −
https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
U downloadt een versie op basis van uw besturingssysteem.
Volg de instructies om Java te downloaden en voer de .exe . uit om Java op uw computer te installeren. Als je Java eenmaal op je computer hebt geïnstalleerd, moet je omgevingsvariabelen zo instellen dat ze verwijzen naar de juiste installatiedirectory's.
Het pad instellen voor Windows 2000/XP
Ervan uitgaande dat u Java hebt geïnstalleerd in de map c:\Program Files\java\jdk −
-
Klik met de rechtermuisknop op 'Deze computer' en selecteer 'Eigenschappen'.
-
Klik op de knop 'Omgevingsvariabelen' onder het tabblad 'Geavanceerd'.
-
Wijzig nu de variabele 'Path' zodat deze ook het pad naar het uitvoerbare Java-bestand bevat. Als het pad bijvoorbeeld momenteel is ingesteld op 'C:\WINDOWS\SYSTEM32', wijzigt u uw pad in 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'.
Het pad instellen voor Windows 95/98/ME
Ervan uitgaande dat u Java hebt geïnstalleerd in de map c:\Program Files\java\jdk −
-
Bewerk het bestand 'C:\autoexec.bat' en voeg de volgende regel toe aan het einde −
SET PATH=%PATH%;C:\Program Files\java\jdk\bin
Het pad instellen voor Linux, UNIX, Solaris, FreeBSD
Omgevingsvariabele PATH moet worden ingesteld om te verwijzen naar waar de Java-binaire bestanden zijn geïnstalleerd. Raadpleeg je shell-documentatie als je hier problemen mee hebt.
Als je bijvoorbeeld bash als shell gebruikt, dan zou je de volgende regel toevoegen aan het einde van je '.bashrc:export PATH=/path/to/java:$PATH'
Populaire Java-editors
Om Java-programma's te schrijven, hebt u een teksteditor nodig. Er zijn zelfs meer geavanceerde IDE's op de markt. Maar voor nu kun je een van de volgende overwegen −
-
Kladblok − Op een Windows-computer kunt u elke eenvoudige teksteditor gebruiken, zoals Kladblok (aanbevolen voor deze zelfstudie) of TextPad.
-
Netbeans − Het is een Java IDE die open-source en gratis is. Het kan worden gedownload van https://netbeans.org/index.html.
-
Verduistering − Het is ook een Java-IDE die is ontwikkeld door de open-sourcegemeenschap van Eclipse en kan worden gedownload van https://www.eclipse.org/.
Java 8 - Lambda-expressies
Lambda-expressies zijn geïntroduceerd in Java 8 en worden aangeprezen als de grootste functie van Java 8. Lambda-expressie vergemakkelijkt functioneel programmeren en vereenvoudigt de ontwikkeling aanzienlijk.
Syntaxis
Een lambda-expressie wordt gekenmerkt door de volgende syntaxis.
parameter -> expression body
Hieronder volgen de belangrijke kenmerken van een lambda-expressie.
-
Optioneel type aangifte − U hoeft het type van een parameter niet aan te geven. De compiler kan hetzelfde afleiden uit de waarde van de parameter.
-
Optioneel haakje rond parameter − U hoeft geen enkele parameter tussen haakjes te declareren. Voor meerdere parameters zijn haakjes vereist.
-
Optionele accolades − Het is niet nodig om accolades te gebruiken in de hoofdtekst van de expressie als de hoofdtekst één enkele instructie bevat.
-
Optioneel retourzoekwoord − De compiler retourneert automatisch de waarde als de hoofdtekst een enkele expressie heeft om de waarde te retourneren. Krullende accolades zijn vereist om aan te geven dat de uitdrukking een waarde retourneert.
Voorbeeld van Lambda-uitdrukkingen
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld C:\> JAVA.
Java8Tester.java
Live demopublic class Java8Tester { public static void main(String args[]) { Java8Tester tester = new Java8Tester(); //with type declaration MathOperation addition = (int a, int b) -> a + b; //with out type declaration MathOperation subtraction = (a, b) -> a - b; //with return statement along with curly braces MathOperation multiplication = (int a, int b) -> { return a * b; }; //without return statement and without curly braces 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)); //without parenthesis GreetingService greetService1 = message -> System.out.println("Hello " + message); //with parenthesis GreetingService greetService2 = (message) -> System.out.println("Hello " + 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); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello Mahesh Hello Suresh
Hieronder volgen de belangrijke punten waarmee rekening moet worden gehouden in het bovenstaande voorbeeld.
-
Lambda-expressies worden voornamelijk gebruikt om inline-implementatie van een functionele interface te definiëren, d.w.z. een interface met slechts één methode. In het bovenstaande voorbeeld hebben we verschillende soorten lambda-expressies gebruikt om de bewerkingsmethode van de MathOperation-interface te definiëren. Vervolgens hebben we de implementatie van sayMessage of GreetingService gedefinieerd.
-
Lambda-expressie elimineert de noodzaak van anonieme klasse en geeft Java een zeer eenvoudige maar krachtige functionele programmeermogelijkheid.
Reikwijdte
Met behulp van lambda-expressie kunt u verwijzen naar elke laatste variabele of effectief laatste variabele (die slechts één keer wordt toegewezen). Lambda-expressie genereert een compilatiefout als aan een variabele de tweede keer een waarde wordt toegewezen.
Bereikvoorbeeld
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld C:\> JAVA.
Java8Tester.java
Live demopublic class Java8Tester { final static String salutation = "Hello! "; public static void main(String args[]) { GreetingService greetService1 = message -> System.out.println(salutation + message); greetService1.sayMessage("Mahesh"); } interface GreetingService { void sayMessage(String message); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Hello! Mahesh
Java 8 - Methodereferenties
Methodeverwijzingen helpen om naar methoden te verwijzen met hun naam. Een methodeverwijzing wordt beschreven met het "::" symbool. Een methodereferentie kan worden gebruikt om naar de volgende soorten methoden te verwijzen −
- Statische methoden
- Instance-methoden
- Constructeurs gebruiken nieuwe operator (TreeSet::new)
Methodereferentievoorbeeld
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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 de System.out::println methode doorgegeven als een statische methode referentie.
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Mahesh Suresh Ramesh Naresh Kalpesh
Java 8 - Functionele interfaces
Functionele interfaces hebben één enkele functionaliteit om te vertonen. Er wordt bijvoorbeeld een Vergelijkbare interface met een enkele methode 'vergelijkenTo' gebruikt voor vergelijkingsdoeleinden. Java 8 heeft veel functionele interfaces gedefinieerd die uitgebreid kunnen worden gebruikt in lambda-expressies. Hieronder volgt de lijst met functionele interfaces die zijn gedefinieerd in het pakket java.util.Function.
Sr.nr. | Interface en beschrijving |
---|---|
1 |
BiConsumer Vertegenwoordigt een bewerking die twee invoerargumenten accepteert en geen resultaat oplevert. |
2 |
BiFunction Vertegenwoordigt een functie die twee argumenten accepteert en een resultaat oplevert. |
3 |
BinaryOperator Vertegenwoordigt een bewerking op twee operanden van hetzelfde type, die een resultaat opleveren van hetzelfde type als de operanden. |
4 |
BiPredicaat Vertegenwoordigt een predikaat (functie met Booleaanse waarde) van twee argumenten. |
5 | BooleanLeverancier Vertegenwoordigt een leverancier van booleaans gewaardeerde resultaten. |
6 |
Consument Vertegenwoordigt een bewerking die een enkel invoerargument accepteert en geen resultaat oplevert. |
7 | DoubleBinaryOperator Vertegenwoordigt een bewerking op twee operanden met dubbele waarde en produceert een resultaat met dubbele waarde. |
8 | Dubbele Consument Vertegenwoordigt een bewerking die een enkel dubbelwaardig argument accepteert en geen resultaat oplevert. |
9 |
Dubbele functie Vertegenwoordigt een functie die een argument met dubbele waarde accepteert en een resultaat oplevert. |
10 | DoublePredicate Vertegenwoordigt een predikaat (functie met Booleaanse waarde) van één argument met dubbele waarde. |
11 | Dubbele Leverancier Vertegenwoordigt een leverancier van resultaten met dubbele waarde. |
12 | DoubleToIntFunction Vertegenwoordigt een functie die een argument met dubbele waarde accepteert en een resultaat met een int-waarde produceert. |
13 | DoubleToLongFunction Vertegenwoordigt een functie die een argument met dubbele waarde accepteert en een resultaat met lange waarde produceert. |
14 | DoubleUnaryOperator Vertegenwoordigt een bewerking op een enkele operand met dubbele waarde die een resultaat met dubbele waarde oplevert. |
15 |
Functie Vertegenwoordigt een functie die één argument accepteert en een resultaat oplevert. |
16 | IntBinaryOperator Vertegenwoordigt een bewerking op twee operanden met int-waarde en produceert een resultaat met int-waarde. |
17 | IntConsumer Vertegenwoordigt een bewerking die een enkel argument met int-waarde accepteert en geen resultaat oplevert. |
18 |
IntFunction Vertegenwoordigt een functie die een argument met int-waarde accepteert en een resultaat oplevert. |
19 | IntPredicate Vertegenwoordigt een predikaat (functie met Booleaanse waarde) van één argument met int-waarde. |
20 | IntSupplier Vertegenwoordigt een leverancier van waardevolle resultaten. |
21 | IntToDoubleFunction Vertegenwoordigt een functie die een argument met een int-waarde accepteert en een resultaat met dubbele waarde produceert. |
22 | IntToLongFunction Vertegenwoordigt een functie die een argument met waarde int accepteert en een resultaat met lange waarde produceert. |
23 | IntUnaryOperator Vertegenwoordigt een bewerking op een enkele operand met een waarde van int die een resultaat met een waarde van int produceert. |
24 | LongBinaryOperator Vertegenwoordigt een bewerking op twee operanden met een lange waarde en produceert een resultaat met een lange waarde. |
25 | Lange Consument Vertegenwoordigt een bewerking die een enkel argument met een lange waarde accepteert en geen resultaat oplevert. |
26 |
Lange functie Vertegenwoordigt een functie die een argument met een lange waarde accepteert en een resultaat oplevert. |
27 | LongPredicate Vertegenwoordigt een predikaat (functie met Booleaanse waarde) van één argument met lange waarde. |
28 | Lange Leverancier Vertegenwoordigt een leverancier van langdurige resultaten. |
29 | LongToDoubleFunction Vertegenwoordigt een functie die een argument met een lange waarde accepteert en een resultaat met dubbele waarde produceert. |
30 | LongToIntFunction Vertegenwoordigt een functie die een argument met een lange waarde accepteert en een resultaat met een waarde van int produceert. |
31 | LongUnaryOperator Vertegenwoordigt een bewerking op een enkele operand met een lange waarde die een resultaat met een lange waarde oplevert. |
32 |
ObjDoubleConsumer Vertegenwoordigt een bewerking die een argument met objectwaarde en een argument met dubbele waarde accepteert en geen resultaat retourneert. |
33 |
ObjIntConsumer Vertegenwoordigt een bewerking die een argument met objectwaarde en een int-waarde accepteert en geen resultaat retourneert. |
34 |
ObjLongConsumer Vertegenwoordigt een bewerking die een argument met objectwaarde en een argument met lange waarde accepteert en geen resultaat retourneert. |
35 |
Predikaat Vertegenwoordigt een predikaat (functie met Booleaanse waarde) van één argument. |
36 |
Leverancier Vertegenwoordigt een leverancier van resultaten. |
37 |
ToDoubleBiFunction Vertegenwoordigt een functie die twee argumenten accepteert en een resultaat met dubbele waarde produceert. |
38 |
ToDoubleFunction Vertegenwoordigt een functie die een resultaat met dubbele waarde produceert. |
39 |
ToIntBiFunction Vertegenwoordigt een functie die twee argumenten accepteert en een resultaat met int-waarde produceert. |
40 |
ToIntFunction Vertegenwoordigt een functie die een resultaat met int-waarde produceert. |
41 |
ToLongBiFunction Vertegenwoordigt een functie die twee argumenten accepteert en een langdurig resultaat oplevert. |
42 |
ToLongFunction Vertegenwoordigt een functie die een langdurig resultaat oplevert. |
43 |
UnaryOperator Vertegenwoordigt een bewerking op een enkele operand die een resultaat oplevert van hetzelfde type als de operand. |
Voorbeeld van functionele interface
Predicaat
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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 is passed as parameter to test method of Predicate interface // test method will always return true no matter what value n has. System.out.println("Print all numbers:"); //pass n as parameter eval(list, n->true); // Predicate<Integer> predicate1 = n -> n%2 == 0 // n is passed as parameter to test method of Predicate interface // test method will return true if n%2 comes to be zero System.out.println("Print even numbers:"); eval(list, n-> n%2 == 0 ); // Predicate<Integer> predicate2 = n -> n > 3 // n is passed as parameter to test method of Predicate interface // test method will return true if n is greater than 3. System.out.println("Print numbers greater than 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 zijn we geslaagd voor de Predicaat-interface, die een enkele invoer nodig heeft en Boolean retourneert.
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Print all numbers: 1 2 3 4 5 6 7 8 9 Print even numbers: 2 4 6 8 Print numbers greater than 3: 4 5 6 7 8 9
Java 8 - Standaardmethoden
Java 8 introduceert een nieuw concept van implementatie van standaardmethoden in interfaces. Deze mogelijkheid is toegevoegd voor achterwaartse compatibiliteit, zodat oude interfaces kunnen worden gebruikt om de lambda-expressiecapaciteit van Java 8 te benutten.
De interfaces 'List' of 'Collection' hebben bijvoorbeeld geen 'forEach'-methodedeclaratie. Het toevoegen van een dergelijke methode zal dus eenvoudig de implementaties van het verzamelingskader doorbreken. Java 8 introduceert een standaardmethode zodat de Lijst/Verzamelingsinterface een standaardimplementatie van de forEach-methode kan hebben, en de klasse die deze interfaces implementeert, hoeft niet dezelfde te implementeren.
Syntaxis
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } }
Meerdere standaardinstellingen
Met standaardfuncties in interfaces is het mogelijk dat een klasse twee interfaces implementeert met dezelfde standaardmethoden. De volgende code legt uit hoe deze dubbelzinnigheid kan worden opgelost.
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } } public interface fourWheeler { default void print() { System.out.println("I am a four wheeler!"); } }
De eerste oplossing is om een eigen methode te maken die de standaardimplementatie overschrijft.
public class car implements vehicle, fourWheeler { public void print() { System.out.println("I am a four wheeler car vehicle!"); } }
De tweede oplossing is om de standaardmethode van de opgegeven interface aan te roepen met super.
public class car implements vehicle, fourWheeler { public void print() { vehicle.super.print(); } }
Statische standaardmethoden
Een interface kan vanaf Java 8 ook statische hulpmethoden hebben.
public interface vehicle { default void print() { System.out.println("I am a vehicle!"); } static void blowHorn() { System.out.println("Blowing horn!!!"); } }
Voorbeeld van standaardmethode
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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("I am a vehicle!"); } static void blowHorn() { System.out.println("Blowing horn!!!"); } } interface FourWheeler { default void print() { System.out.println("I am a four wheeler!"); } } class Car implements Vehicle, FourWheeler { public void print() { Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("I am a car!"); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
I am a vehicle! I am a four wheeler! Blowing horn!!! I am a car!
Java 8 - Streams
Stream is een nieuwe abstracte laag die in Java 8 is geïntroduceerd. Met stream kunt u gegevens op een declaratieve manier verwerken, vergelijkbaar met SQL-instructies. Beschouw bijvoorbeeld de volgende SQL-instructie.
SELECT max(salary), employee_id, employee_name FROM Employee
De bovenstaande SQL-expressie retourneert automatisch de gegevens van de maximaal bezoldigde werknemer, zonder enige berekening aan de kant van de ontwikkelaar. Met behulp van het verzamelingsframework in Java moet een ontwikkelaar lussen gebruiken en herhaalde controles uitvoeren. Een andere zorg is efficiëntie; aangezien multi-coreprocessors gemakkelijk beschikbaar zijn, moet een Java-ontwikkelaar parallelle codeverwerking schrijven die behoorlijk foutgevoelig kan zijn.
Om dergelijke problemen op te lossen, introduceerde Java 8 het concept van stream waarmee de ontwikkelaar gegevens declaratief kan verwerken en multicore-architectuur kan gebruiken zonder dat er specifieke code voor hoeft te worden geschreven.
Wat is streamen?
Stream vertegenwoordigt een reeks objecten uit een bron, die aggregatiebewerkingen ondersteunt. Hieronder volgen de kenmerken van een stream −
-
Opeenvolging van elementen − Een stream levert een reeks elementen van een specifiek type op een sequentiële manier. Een stream krijgt/berekent elementen op aanvraag. Het slaat nooit de elementen op.
-
Bron − Stream gebruikt verzamelingen, arrays of I/O-bronnen als invoerbron.
-
Totale bewerkingen − Stream ondersteunt geaggregeerde bewerkingen zoals filteren, in kaart brengen, beperken, verkleinen, vinden, matchen, enzovoort.
-
Pijpvoering − De meeste stroombewerkingen retourneren de stroom zelf, zodat hun resultaat kan worden gepijplijnd. Deze bewerkingen worden tussenbewerkingen genoemd en hun functie is om invoer te nemen, deze te verwerken en de uitvoer terug te sturen naar het doel. collect()-methode is een terminalbewerking die normaal gesproken aanwezig is aan het einde van de pipelining-bewerking om het einde van de stream te markeren.
-
Automatische herhalingen − Streambewerkingen voeren de iteraties intern uit over de geleverde bronelementen, in tegenstelling tot collecties waar expliciete iteratie vereist is.
Stremen genereren
Met Java 8 heeft de Collection-interface twee methoden om een stream te genereren.
-
stream() − Retourneert een sequentiële stream waarbij de verzameling als bron wordt beschouwd.
-
parallelStream() − Retourneert een parallelle stream waarbij de verzameling als bron wordt beschouwd.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
voor elk
Stream heeft een nieuwe methode 'forEach' geboden om elk element van de stream te herhalen. Het volgende codesegment laat zien hoe u 10 willekeurige getallen kunt afdrukken met forEach.
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
kaart
De 'map'-methode wordt gebruikt om elk element toe te wijzen aan het bijbehorende resultaat. Het volgende codesegment drukt unieke vierkanten van getallen af met behulp van de kaart.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //get list of unique squares List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
filter
De ‘filter’ methode wordt gebruikt om elementen te verwijderen op basis van een criterium. Het volgende codesegment drukt een telling van lege tekenreeksen af met behulp van filter.
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); //get count of empty string int count = strings.stream().filter(string -> string.isEmpty()).count();
limiet
De 'limiet'-methode wordt gebruikt om de stroom te verkleinen. Het volgende codesegment laat zien hoe u 10 willekeurige getallen kunt afdrukken met limiet.
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
gesorteerd
De ‘gesorteerde’ methode wordt gebruikt om de stream te sorteren. Het volgende codesegment laat zien hoe u 10 willekeurige getallen in een gesorteerde volgorde kunt afdrukken.
Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);
Parallelle verwerking
parallelStream is het alternatief van stream voor parallelle verwerking. Bekijk het volgende codesegment dat een aantal lege strings afdrukt met parallelStream.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); //get count of empty string long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
Het is heel eenvoudig om te schakelen tussen sequentiële en parallelle streams.
Verzamelaars
Collectors worden gebruikt om het resultaat van verwerking op de elementen van een stroom te combineren. Verzamelaars kunnen worden gebruikt om een lijst of een tekenreeks te retourneren.
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("Filtered List: " + filtered); String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("Merged String: " + mergedString);
Statistieken
Met Java 8 worden statistiekenverzamelaars geïntroduceerd om alle statistieken te berekenen wanneer streamverwerking wordt gedaan.
List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("Highest number in List : " + stats.getMax()); System.out.println("Lowest number in List : " + stats.getMin()); System.out.println("Sum of all numbers : " + stats.getSum()); System.out.println("Average of all numbers : " + stats.getAverage());
Streamvoorbeeld
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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("Using Java 7: "); // Count empty strings List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); System.out.println("List: " +strings); long count = getCountEmptyStringUsingJava7(strings); System.out.println("Empty Strings: " + count); count = getCountLength3UsingJava7(strings); System.out.println("Strings of length 3: " + count); //Eliminate empty string List<String> filtered = deleteEmptyStringsUsingJava7(strings); System.out.println("Filtered List: " + filtered); //Eliminate empty string and join using comma. String mergedString = getMergedStringUsingJava7(strings,", "); System.out.println("Merged String: " + mergedString); List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //get list of square of distinct numbers List<Integer> squaresList = getSquares(numbers); System.out.println("Squares List: " + squaresList); List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19); System.out.println("List: " +integers); System.out.println("Highest number in List : " + getMax(integers)); System.out.println("Lowest number in List : " + getMin(integers)); System.out.println("Sum of all numbers : " + getSum(integers)); System.out.println("Average of all numbers : " + getAverage(integers)); System.out.println("Random Numbers: "); //print ten random numbers Random random = new Random(); for(int i = 0; i < 10; i++) { System.out.println(random.nextInt()); } System.out.println("Using Java 8: "); System.out.println("List: " +strings); count = strings.stream().filter(string->string.isEmpty()).count(); System.out.println("Empty Strings: " + count); count = strings.stream().filter(string -> string.length() == 3).count(); System.out.println("Strings of length 3: " + count); filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList()); System.out.println("Filtered List: " + filtered); mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("Merged String: " + mergedString); squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList()); System.out.println("Squares List: " + squaresList); System.out.println("List: " +integers); IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics(); System.out.println("Highest number in List : " + stats.getMax()); System.out.println("Lowest number in List : " + stats.getMin()); System.out.println("Sum of all numbers : " + stats.getSum()); System.out.println("Average of all numbers : " + stats.getAverage()); System.out.println("Random Numbers: "); random.ints().limit(10).sorted().forEach(System.out::println); //parallel processing count = strings.parallelStream().filter(string -> string.isEmpty()).count(); System.out.println("Empty 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(); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten opleveren −
Using Java 7: List: [abc, , bc, efg, abcd, , jkl] Empty Strings: 2 Strings of length 3: 3 Filtered List: [abc, bc, efg, abcd, jkl] Merged String: abc, bc, efg, abcd, jkl Squares List: [9, 4, 49, 25] List: [1, 2, 13, 4, 15, 6, 17, 8, 19] Highest number in List : 19 Lowest number in List : 1 Sum of all numbers : 85 Average of all numbers : 9 Random Numbers: -1279735475 903418352 -1133928044 -1571118911 628530462 18407523 -881538250 -718932165 270259229 421676854 Using Java 8: List: [abc, , bc, efg, abcd, , jkl] Empty Strings: 2 Strings of length 3: 3 Filtered List: [abc, bc, efg, abcd, jkl] Merged String: abc, bc, efg, abcd, jkl Squares List: [9, 4, 49, 25] List: [1, 2, 13, 4, 15, 6, 17, 8, 19] Highest number in List : 19 Lowest number in List : 1 Sum of all numbers : 85 Average of all numbers : 9.444444444444445 Random Numbers: -1009474951 -551240647 -2484714 181614550 933444268 1227850416 1579250773 1627454872 1683033687 1798939493 Empty Strings: 2
Java 8 - optionele klasse
Optioneel is een containerobject dat wordt gebruikt om niet-null-objecten te bevatten. Optioneel object wordt gebruikt om null weer te geven met afwezige waarde. Deze klasse heeft verschillende hulpprogramma's om code te vergemakkelijken om waarden als 'beschikbaar' of 'niet beschikbaar' te verwerken in plaats van null-waarden te controleren. Het is geïntroduceerd in Java 8 en is vergelijkbaar met wat Optioneel is in Guava.
Klasseverklaring
Hieronder volgt de verklaring voor java.util.Optional
public final class Optional<T> extends Object
Klasse Methode
Sr.nr. | Methode en beschrijving |
---|---|
1 |
statisch Retourneert een lege optionele instantie. |
2 | boolean is gelijk aan(Object obj) Geeft aan of een ander object "gelijk is aan" dit Optioneel. |
3 |
Optioneel Als een waarde aanwezig is en de waarde komt overeen met een bepaald predikaat, retourneert het een Optioneel die de waarde beschrijft, anders wordt een lege Optioneel geretourneerd. |
4 | Optioneel flatMap(Function super T,Optioneel> mapper) Als er een waarde aanwezig is, past deze de verstrekte toewijzingsfunctie voor optionele lagers erop toe, retourneert dat resultaat en retourneert anders een lege Optioneel. |
5 | T get() Als er een waarde aanwezig is in deze Optioneel, wordt de waarde geretourneerd, anders wordt NoSuchElementException gegenereerd. |
6 | int hashCode() Retourneert de hash-codewaarde van de huidige waarde, indien aanwezig, of 0 (nul) als er geen waarde aanwezig is. |
7 | void ifPresent(Consumer super T> consumer) Als een waarde aanwezig is, roept het de gespecificeerde consument op met de waarde, anders doet het niets. |
8 | boolean isPresent() Retourneert waar als er een waarde aanwezig is, anders onwaar. |
9 | Optionele map(Function super T,? extends U> mapper) Als een waarde aanwezig is, wordt de verstrekte toewijzingsfunctie erop toegepast en als het resultaat niet-null is, wordt een Optioneel geretourneerd dat het resultaat beschrijft. |
10 |
statisch Retourneert een Optioneel met de opgegeven huidige niet-null-waarde. |
11 |
statisch Retourneert een Optioneel die de opgegeven waarde beschrijft, indien niet-null, anders retourneert een lege Optioneel. |
12 | T ofElse(T andere) Retourneert de waarde indien aanwezig, retourneert anders anders. |
13 | T orElseGet(Leverancier breidt T> overig uit) Retourneert de waarde indien aanwezig, anders roept andere op en retourneert het resultaat van die aanroep. |
14 |
Retourneert de ingesloten waarde, indien aanwezig, anders wordt een uitzondering gegenereerd die door de opgegeven leverancier moet worden gemaakt. |
15 | String naarString() Retourneert een niet-lege tekenreeksrepresentatie van deze Optioneel die geschikt is voor foutopsporing. |
Deze klasse erft methoden van de volgende klasse −
- java.lang.Object
Optioneel voorbeeld
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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 - allows passed parameter to be null. Optional<Integer> a = Optional.ofNullable(value1); //Optional.of - throws NullPointerException if passed parameter is null Optional<Integer> b = Optional.of(value2); System.out.println(java8Tester.sum(a,b)); } public Integer sum(Optional<Integer> a, Optional<Integer> b) { //Optional.isPresent - checks the value is present or not System.out.println("First parameter is present: " + a.isPresent()); System.out.println("Second parameter is present: " + b.isPresent()); //Optional.orElse - returns the value if present otherwise returns //the default value passed. Integer value1 = a.orElse(new Integer(0)); //Optional.get - gets the value, value should be present Integer value2 = b.get(); return value1 + value2; } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
First parameter is present: false Second parameter is present: true 10
Java 8 - Nashorn JavaScript
Met Java 8, Nashorn, wordt een sterk verbeterde javascript-engine geïntroduceerd, ter vervanging van de bestaande Rhino. Nashorn levert 2 tot 10 keer betere prestaties, omdat het de code direct in het geheugen compileert en de bytecode doorgeeft aan JVM. Nashorn gebruikt de functie Invoke dynamics, geïntroduceerd in Java 7 om de prestaties te verbeteren.
jjs
Voor de Nashorn-engine introduceert JAVA 8 een nieuwe opdrachtregeltool, jjs, om javascript-codes uit te voeren op de console.
Js-bestand interpreteren
Maak en bewaar het bestand sample.js in c:\> JAVA-map.
voorbeeld.js
print('Hello World!');
Open de console en gebruik de volgende opdracht.
C:\JAVA>jjs sample.js
Het zal de volgende output produceren:
Hello World!
jjs in interactieve modus
Open de console en gebruik de volgende opdracht.
C:\JAVA>jjs jjs> print("Hello, World!") Hello, World! jjs> quit() >>
Argumenten doorgeven
Open de console en gebruik de volgende opdracht.
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 met een editor naar keuze, bijvoorbeeld 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("Error executing script: "+ e.getMessage()); } System.out.println(result.toString()); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten opleveren −
Mahesh 12
Java aanroepen vanuit JavaScript
In het volgende voorbeeld wordt uitgelegd hoe u Java-klassen in javascript importeert en gebruikt.
Maak en bewaar sample.js in c:\> JAVA-map.
voorbeeld.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 de volgende opdracht.
C:\JAVA>jjs sample.js
Het zou de volgende output moeten produceren −
78952000000000000003.20
Java 8 - Nieuwe datum/tijd-API
Met Java 8 wordt een nieuwe Date-Time API geïntroduceerd om de volgende nadelen van de oude Date-Time API te dekken.
-
Niet threadveilig − java.util.Date is niet thread-safe, dus ontwikkelaars hebben te maken met gelijktijdigheidsproblemen tijdens het gebruik van date. De nieuwe datum-tijd-API is onveranderlijk en heeft geen setter-methoden.
-
Slecht ontwerp − Standaarddatum begint bij 1900, maand begint bij 1 en dag begint bij 0, dus geen uniformiteit. De oude API had minder directe methoden voor datumbewerkingen. De nieuwe API biedt tal van hulpprogramma's voor dergelijke bewerkingen.
-
Moeilijke afhandeling van tijdzones − Ontwikkelaars moesten veel code schrijven om tijdzoneproblemen op te lossen. De nieuwe API is ontwikkeld met het oog op een domeinspecifiek ontwerp.
Java 8 introduceert een nieuwe date-time API onder het pakket java.time. Hieronder volgen enkele van de belangrijke klassen die in het java.time-pakket zijn geïntroduceerd.
-
Lokaal − Vereenvoudigde datum-tijd-API zonder complexiteit van tijdzoneverwerking.
-
Gezoneerd − Gespecialiseerde datum-tijd-API om met verschillende tijdzones om te gaan.
Lokale datum-tijd-API
De klassen LocalDate/LocalTime en LocalDateTime vereenvoudigen de ontwikkeling waar tijdzones niet vereist zijn. Laten we ze in actie zien.
Maak het volgende java-programma met een editor naar keuze, bijvoorbeeld 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() { // Get the current date and time LocalDateTime currentTime = LocalDateTime.now(); System.out.println("Current 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("Month: " + month +"day: " + day +"seconds: " + 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 hour 15 minutes LocalTime date4 = LocalTime.of(22, 15); System.out.println("date4: " + date4); //parse a string LocalTime date5 = LocalTime.parse("20:15:30"); System.out.println("date5: " + date5); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Current DateTime: 2014-12-09T11:00:45.457 date1: 2014-12-09 Month: DECEMBERday: 9seconds: 45 date2: 2012-12-10T11:00:45.457 date3: 2014-12-12 date4: 22:15 date5: 20:15:30
Gezoneerde datum-tijd-API
Gezoneerde datum-tijd-API moet worden gebruikt wanneer rekening moet worden gehouden met de tijdzone. Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { // Get the current date and time 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); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
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 toegevoegd in Java 8 om de gehele waarden te vervangen die in de oude API werden gebruikt om dag, maand, enz. weer te geven. Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { //Get the current date LocalDate today = LocalDate.now(); System.out.println("Current date: " + today); //add 1 week to the current date LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); System.out.println("Next week: " + nextWeek); //add 1 month to the current date LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS); System.out.println("Next month: " + nextMonth); //add 1 year to the current date LocalDate nextYear = today.plus(1, ChronoUnit.YEARS); System.out.println("Next year: " + nextYear); //add 10 years to the current date LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES); System.out.println("Date after ten year: " + nextDecade); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten opleveren −
Current date: 2014-12-10 Next week: 2014-12-17 Next month: 2015-01-10 Next year: 2015-12-10 Date after ten year: 2024-12-10
Periode en duur
Met Java 8 worden twee gespecialiseerde klassen geïntroduceerd om met de tijdsverschillen om te gaan.
-
Periode − Het gaat over op datum gebaseerde hoeveelheid tijd.
-
Duur − Het gaat over op tijd gebaseerde hoeveelheid tijd.
Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { //Get the current date LocalDate date1 = LocalDate.now(); System.out.println("Current date: " + date1); //add 1 month to the current date LocalDate date2 = date1.plus(1, ChronoUnit.MONTHS); System.out.println("Next month: " + 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); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Current date: 2014-12-10 Next month: 2015-01-10 Period: P-1M Duration: PT2H
Tijdelijke Richters
TemporalAdjuster wordt gebruikt om de datumwiskunde uit te voeren. Ontvang bijvoorbeeld de "Tweede zaterdag van de maand" of "Volgende dinsdag". Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { //Get the current date LocalDate date1 = LocalDate.now(); System.out.println("Current date: " + date1); //get the next tuesday LocalDate nextTuesday = date1.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)); System.out.println("Next Tuesday on : " + nextTuesday); //get the second saturday of next month 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("Second Saturday on : " + secondSaturday); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou het volgende resultaat moeten opleveren −
Current date: 2014-12-10 Next Tuesday on : 2014-12-16 Second Saturday on : 2014-12-13
Achterwaartse compatibiliteit
Er is een methode toInstant() toegevoegd aan de oorspronkelijke objecten Date en Calendar, die kan worden gebruikt om ze te converteren naar de nieuwe Date-Time API. Gebruik een methode ofInstant(Insant,ZoneId) om een LocalDateTime- of ZonedDateTime-object op te halen. Laten we ze in actie zien.
Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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() { //Get the current date Date currentDate = new Date(); System.out.println("Current date: " + currentDate); //Get the instant of current date in terms of milliseconds Instant now = currentDate.toInstant(); ZoneId currentZone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone); System.out.println("Local date: " + localDateTime); ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone); System.out.println("Zoned date: " + zonedDateTime); } }
Verifieer het resultaat
Stel de klas samen met javac compiler als volgt −
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester als volgt uit −
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren −
Current date: Wed Dec 10 05:44:06 UTC 2014 Local date: 2014-12-10T05:44:06.635 Zoned date: 2014-12-10T05:44:06.635Z[Etc/UTC]
Java 8 - Base64
Met Java 8 komt Base64 eindelijk tot zijn recht. Java 8 heeft nu een ingebouwde encoder en decoder voor Base64-codering. In Java 8 kunnen we drie soorten Base64-codering gebruiken.
-
Eenvoudig − De uitvoer wordt toegewezen aan een set tekens die in A-Za-z0-9+/ liggen. De encoder voegt geen regelinvoer toe aan de uitvoer en de decoder verwerpt elk ander teken dan A-Za-z0-9+/.
-
URL − De uitvoer wordt toegewezen aan een reeks tekens die in A-Za-z0-9+_ liggen. Uitvoer is veilig voor URL en bestandsnaam.
-
MIME − De uitvoer is toegewezen aan een MIME-vriendelijk formaat. De uitvoer wordt weergegeven in regels van niet meer dan 76 tekens en gebruikt een regelterugloop '\r' gevolgd door een regelinvoer '\n' als regelscheidingsteken. Er is geen lijnscheidingsteken aanwezig aan het einde van de gecodeerde uitvoer.
Geneste klassen
Sr.nr. | Geneste klasse en beschrijving |
---|---|
1 | statische klasse Base64.Decoder Deze klasse implementeert een decoder voor het decoderen van bytegegevens met behulp van het Base64-coderingsschema zoals gespecificeerd in RFC 4648 en RFC 2045. |
2 | statische klasse Base64.Encoder Deze klasse implementeert een encoder voor het coderen van bytegegevens met behulp van het Base64-coderingsschema zoals gespecificeerd in RFC 4648 en RFC 2045. |
Methoden
Sr.nr. | Methodenaam en beschrijving |
---|---|
1 | statische Base64.Decoder getDecoder() Retourneert een Base64.Decoder die decodeert met behulp van het basis64-coderingsschema van het basistype. |
2 | statische Base64.Encoder getEncoder() Retourneert een Base64.Encoder die codeert met behulp van het basis64-coderingsschema van het type Basic. |
3 | statische Base64.Decoder getMimeDecoder() Returns a Base64.Decoder that decodes using the MIME type base64 decoding scheme. |
4 | static Base64.Encoder getMimeEncoder() Returns a Base64.Encoder that encodes using the MIME type base64 encoding scheme. |
5 | static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator) Returns a Base64.Encoder that encodes using the MIME type base64 encoding scheme with specified line length and line separators. |
6 | static Base64.Decoder getUrlDecoder() Returns a Base64.Decoder that decodes using the URL and Filename safe type base64 encoding scheme. |
7 | static Base64.Encoder getUrlEncoder() Returns a Base64.Encoder that encodes using the URL and Filename safe type base64 encoding scheme. |
Methods Inherited
This class inherits methods from the following class −
- java.lang.Object
Base64 Example
Create the following Java program using any editor of your choice in say 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 { // Encode using basic encoder String base64encodedString = Base64.getEncoder().encodeToString( "TutorialsPoint?java8".getBytes("utf-8")); System.out.println("Base64 Encoded String (Basic) :" + base64encodedString); // Decode byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString); System.out.println("Original String: " + new String(base64decodedBytes, "utf-8")); base64encodedString = Base64.getUrlEncoder().encodeToString( "TutorialsPoint?java8".getBytes("utf-8")); System.out.println("Base64 Encoded 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 Encoded String (MIME) :" + mimeEncodedString); } catch(UnsupportedEncodingException e) { System.out.println("Error :" + e.getMessage()); } } }
Verify the Result
Compile the class using javac compiler as follows −
C:\JAVA>javac Java8Tester.java
Now run the Java8Tester as follows −
C:\JAVA>java Java8Tester
It should produce the following output −
Base64 Encoded String (Basic) :VHV0b3JpYWxzUG9pbnQ/amF2YTg= Original String: TutorialsPoint?java8 Base64 Encoded String (URL) :VHV0b3JpYWxzUG9pbnQ_amF2YTg= Base64 Encoded String (MIME) :YmU3NWY2ODktNGM5YS00ODlmLWI2MTUtZTVkOTk2YzQ1Njk1Y2EwZTg2OTEtMmRiZC00YTQ1LWJl NTctMTI1MWUwMTk0ZWQyNDE0NDAwYjgtYTYxOS00NDY5LTllYTctNjc1YzE3YWJhZTk1MTQ2MDQz NDItOTAyOC00ZWI0LThlOTYtZWU5YzcwNWQyYzVhMTQxMWRjYTMtY2MwNi00MzU0LTg0MTgtNGQ1 MDkwYjdiMzg2ZTY0OWU5MmUtZmNkYS00YWEwLTg0MjQtYThiOTQxNDQ2YzhhNTVhYWExZjItNjU2 Mi00YmM4LTk2ZGYtMDE4YmY5ZDZhMjkwMzM3MWUzNDMtMmQ3MS00MDczLWI0Y2UtMTQxODE0MGU5 YjdmYTVlODUxYzItN2NmOS00N2UyLWIyODQtMThlMWVkYTY4M2Q1YjE3YTMyYmItZjllMS00MTFk LWJiM2UtM2JhYzUxYzI5OWI4
Java
- Java-vector
- Frezen – Een beknopte handleiding
- Beknopte handleiding voor de ontwikkeling en uitvoering van PM
- Een korte handleiding voor verzekeringen voor verstoringen in de toeleveringsketen
- Een beknopte handleiding voor het buigen van vierkante buizen
- Een beknopte handleiding voor koude persmachines
- Een beknopte handleiding voor planetaire versnellingsbakken
- Een beknopte handleiding voor straalmolenboormachines
- Een beknopte handleiding voor servopersmachines
- Een beknopte handleiding voor pneumatische cilinders
- Een korte handleiding voor Gear Decoiler