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 - 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 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("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 demo
public 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 demo
public 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 -interface is een functionele interface met een methodetest (Object) om een ​​Booleaanse waarde te retourneren. Deze interface geeft aan dat een object is getest om waar of onwaar te zijn.

Maak het volgende Java-programma met een editor naar keuze, bijvoorbeeld 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 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 demo
public 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 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("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 klasse −

public final class Optional<T> extends Object

Klasse Methode

Sr.nr. Methode en beschrijving
1

statisch Optioneel leeg()

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 filter(predikaat predikaat)

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> 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 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 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 Optioneel van (T-waarde)

Retourneert een Optioneel met de opgegeven huidige niet-null-waarde.

11

statisch Optioneel ofNullable(T-waarde)

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 overig uit)

Retourneert de waarde indien aanwezig, anders roept andere op en retourneert het resultaat van die aanroep.

14

T orElseThrow(Leverancier exceptionSupplier uit)

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 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 - 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 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("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 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() {
      // 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 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() {
      // 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 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() {
      //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 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() {
      //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 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() {
      //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 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() {
      //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 Demo
import 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

  1. Java-vector
  2. Frezen – Een beknopte handleiding
  3. Beknopte handleiding voor de ontwikkeling en uitvoering van PM
  4. Een korte handleiding voor verzekeringen voor verstoringen in de toeleveringsketen
  5. Een beknopte handleiding voor het buigen van vierkante buizen
  6. Een beknopte handleiding voor koude persmachines
  7. Een beknopte handleiding voor planetaire versnellingsbakken
  8. Een beknopte handleiding voor straalmolenboormachines
  9. Een beknopte handleiding voor servopersmachines
  10. Een beknopte handleiding voor pneumatische cilinders
  11. Een korte handleiding voor Gear Decoiler