Java 8 - Краткое руководство

JAVA 8 - это выпуск основной функции разработки языка программирования JAVA. Его первоначальная версия была выпущена 18 марта 2014 года. С выпуском Java 8 Java обеспечила поддержку функционального программирования, новый движок JavaScript, новые API для манипулирования датой и временем, новый потоковый API и т. Д.

Новые возможности

  • Lambda expression - Добавляет функциональные возможности обработки в Java.

  • Method references- Обращение к функциям по их именам вместо их прямого вызова. Использование функций в качестве параметра.

  • Default method - Интерфейс для реализации метода по умолчанию.

  • New tools - Добавлены новые инструменты и утилиты компилятора, такие как jdeps, для определения зависимостей.

  • Stream API - Новый потоковый API для облегчения конвейерной обработки.

  • Date Time API - Улучшен API даты и времени.

  • Optional - Упор на передовой опыт правильной обработки нулевых значений.

  • Nashorn, JavaScript Engine - Механизм на основе Java для выполнения кода JavaScript.

Рассмотрим следующий фрагмент кода.

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));
   }
}

Запустите программу, чтобы получить следующий результат.

Sort using Java 7 syntax:
[ Kalpesh Mahesh Naresh Ramesh Suresh ]
Sort using Java 8 syntax:
[ Kalpesh Mahesh Naresh Ramesh Suresh ]

Здесь sortUsingJava8() Метод использует функцию сортировки с лямбда-выражением в качестве параметра для получения критериев сортировки.

Настройка локальной среды

Если вы хотите создать свою собственную среду для языка программирования Java, этот раздел проведет вас через весь процесс. Следуйте инструкциям, приведенным ниже, чтобы настроить среду Java.

Java SE можно скачать бесплатно по следующей ссылке -

https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

Вы загружаете версию, соответствующую вашей операционной системе.

Следуйте инструкциям по загрузке Java и запустите .exeчтобы установить Java на свой компьютер. После того, как вы установили Java на свой компьютер, вам нужно будет установить переменные среды, чтобы они указывали на правильные каталоги установки.

Настройка пути для Windows 2000 / XP

Предполагая, что вы установили Java в каталог c: \ Program Files \ java \ jdk -

  • Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства».

  • Нажмите кнопку «Переменные среды» на вкладке «Дополнительно».

  • Теперь измените переменную Path, чтобы она также содержала путь к исполняемому файлу Java. Например, если в настоящее время задан путь «C: \ WINDOWS \ SYSTEM32», измените путь на «C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin».

Настройка пути для Windows 95/98 / ME

Предполагая, что вы установили Java в каталог c: \ Program Files \ java \ jdk -

  • Отредактируйте файл C: \ autoexec.bat и добавьте в конец следующую строку -

    УСТАНОВИТЬ ПУТЬ =% ПУТЬ%; C: \ Program Files \ java \ jdk \ bin

Настройка пути для Linux, UNIX, Solaris, FreeBSD

Переменная среды PATH должна указывать на место установки двоичных файлов Java. Обратитесь к документации по оболочке, если у вас возникли проблемы с этим.

Например, если вы используете bash в качестве оболочки, вы должны добавить следующую строку в конец вашего .bashrc: export PATH = / path / to / java: $ PATH '

Популярные редакторы Java

Чтобы писать программы на Java, вам понадобится текстовый редактор. На рынке доступны даже более сложные IDE. Но пока вы можете рассмотреть одно из следующих:

  • Notepad - На компьютере с Windows вы можете использовать любой простой текстовый редактор, например Блокнот (рекомендуется для этого руководства) или TextPad.

  • Netbeans- Это Java IDE с открытым исходным кодом и бесплатная. Его можно скачать сhttps://netbeans.org/index.html.

  • Eclipse - Это также Java IDE, разработанная сообществом разработчиков ПО Eclipse с открытым исходным кодом, которую можно загрузить с https://www.eclipse.org/.

Лямбда-выражения введены в Java 8 и считаются самой большой особенностью Java 8. Лямбда-выражения упрощают функциональное программирование и значительно упрощают разработку.

Синтаксис

Лямбда-выражение характеризуется следующим синтаксисом.

parameter -> expression body

Ниже приведены важные характеристики лямбда-выражения.

  • Optional type declaration- Нет необходимости объявлять тип параметра. Компилятор может сделать то же самое из значения параметра.

  • Optional parenthesis around parameter- Нет необходимости объявлять один параметр в скобках. Для нескольких параметров обязательны скобки.

  • Optional curly braces - Не нужно использовать фигурные скобки в теле выражения, если тело содержит один оператор.

  • Optional return keyword- Компилятор автоматически возвращает значение, если в теле есть одно выражение для возврата значения. Фигурные скобки необходимы, чтобы указать, что выражение возвращает значение.

Пример лямбда-выражений

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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);
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh

Ниже приведены важные моменты, которые следует учитывать в приведенном выше примере.

  • Лямбда-выражения используются в основном для определения встроенной реализации функционального интерфейса, т. Е. Интерфейса только с одним методом. В приведенном выше примере мы использовали различные типы лямбда-выражений для определения метода работы интерфейса MathOperation. Затем мы определили реализацию sayMessage GreetingService.

  • Лямбда-выражение устраняет необходимость в анонимном классе и дает очень простые, но мощные возможности функционального программирования для Java.

Объем

Используя лямбда-выражение, вы можете ссылаться на любую конечную переменную или фактически конечную переменную (которая назначается только один раз). Лямбда-выражение вызывает ошибку компиляции, если переменной присваивается значение второй раз.

Пример области действия

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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);
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

Hello! Mahesh

Ссылки на методы помогают указать методы по их именам. Ссылка на метод описывается символом «::». Ссылка на метод может использоваться для указания следующих типов методов:

  • Статические методы
  • Методы экземпляра
  • Конструкторы, использующие оператор new (TreeSet :: new)

Справочный пример метода

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, 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);
   }
}

Здесь мы передали метод System.out :: println как ссылку на статический метод.

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

Mahesh
Suresh
Ramesh
Naresh
Kalpesh

Функциональные интерфейсы демонстрируют единственную функциональность. Например, для сравнения используется интерфейс Comparable с единственным методом compareTo. В Java 8 определено множество функциональных интерфейсов, которые будут широко использоваться в лямбда-выражениях. Ниже приводится список функциональных интерфейсов, определенных в пакете java.util.Function.

Sr.No. Интерфейс и описание
1

BiConsumer<T,U>

Представляет операцию, которая принимает два входных аргумента и не возвращает результата.

2

BiFunction<T,U,R>

Представляет функцию, которая принимает два аргумента и выдает результат.

3

BinaryOperator<T>

Представляет операцию над двумя операндами одного типа, в результате чего получается результат того же типа, что и операнды.

4

BiPredicate<T,U>

Представляет предикат (функцию с логическим значением) из двух аргументов.

5

BooleanSupplier

Представляет поставщика результатов с логическим значением.

6

Consumer<T>

Представляет операцию, которая принимает один входной аргумент и не возвращает результата.

7

DoubleBinaryOperator

Представляет операцию с двумя двузначными операндами и дает двузначный результат.

8

DoubleConsumer

Представляет операцию, которая принимает один аргумент с двойным значением и не возвращает результата.

9

DoubleFunction<R>

Представляет функцию, которая принимает аргумент с двойным значением и возвращает результат.

10

DoublePredicate

Представляет предикат (функция с логическим значением) одного двузначного аргумента.

11

DoubleSupplier

Представляет поставщика результатов с двойным значением.

12

DoubleToIntFunction

Представляет функцию, которая принимает аргумент с двойным значением и возвращает результат с целым числом.

13

DoubleToLongFunction

Представляет функцию, которая принимает аргумент с двойным значением и возвращает результат с длинным значением.

14

DoubleUnaryOperator

Представляет операцию с одним двузначным операндом, которая дает двузначный результат.

15

Function<T,R>

Представляет функцию, которая принимает один аргумент и выдает результат.

16

IntBinaryOperator

Представляет операцию с двумя операндами с целым числом значений и дает результат с целым числом значений.

17

IntConsumer

Представляет операцию, которая принимает один аргумент с целым значением и не возвращает результата.

18

IntFunction<R>

Представляет функцию, которая принимает аргумент с целым числом значений и выдает результат.

19

IntPredicate

Представляет предикат (функцию с логическим значением) одного аргумента с целым значением.

20

IntSupplier

Представляет поставщика результатов с целочисленным значением.

21 год

IntToDoubleFunction

Представляет функцию, которая принимает аргумент с целым числом значений и дает результат с двумя значениями.

22

IntToLongFunction

Представляет функцию, которая принимает аргумент с целым значением и возвращает результат с длинным значением.

23

IntUnaryOperator

Представляет операцию с одним операндом с целым значением, которая дает результат с целым значением.

24

LongBinaryOperator

Представляет операцию над двумя операндами с длинными значениями и дает результат с длинными значениями.

25

LongConsumer

Представляет операцию, которая принимает один аргумент с длинным значением и не возвращает результата.

26

LongFunction<R>

Представляет функцию, которая принимает аргумент с длинным значением и возвращает результат.

27

LongPredicate

Представляет предикат (функцию с логическим значением) одного длинного аргумента.

28

LongSupplier

Представляет поставщика долгосрочных результатов.

29

LongToDoubleFunction

Представляет функцию, которая принимает аргумент с длинным значением и дает результат с двойным значением.

30

LongToIntFunction

Представляет функцию, которая принимает аргумент с длинным значением и дает результат с целым значением.

31 год

LongUnaryOperator

Представляет операцию с одним длинным операндом, которая приводит к длинному результату.

32

ObjDoubleConsumer<T>

Представляет операцию, которая принимает объектное значение и аргумент с двойным значением и не возвращает результата.

33

ObjIntConsumer<T>

Представляет операцию, которая принимает аргумент со значением объекта и аргумент с целым значением и не возвращает результата.

34

ObjLongConsumer<T>

Представляет операцию, которая принимает аргумент с объектным значением и аргумент с длинным значением и не возвращает результата.

35 год

Predicate<T>

Представляет предикат (функцию с логическим значением) одного аргумента.

36

Supplier<T>

Представляет поставщика результатов.

37

ToDoubleBiFunction<T,U>

Представляет функцию, которая принимает два аргумента и выдает двузначный результат.

38

ToDoubleFunction<T>

Представляет функцию, которая возвращает результат с двойным значением.

39

ToIntBiFunction<T,U>

Представляет функцию, которая принимает два аргумента и выдает результат со значением типа int.

40

ToIntFunction<T>

Представляет функцию, которая возвращает результат с целым числом значений.

41 год

ToLongBiFunction<T,U>

Представляет функцию, которая принимает два аргумента и возвращает результат с длинным значением.

42

ToLongFunction<T>

Представляет функцию, которая возвращает результат с длинным значением.

43 год

UnaryOperator<T>

Представляет операцию с одним операндом, которая дает результат того же типа, что и его операнд.

Пример функционального интерфейса

Интерфейс Predicate <T> - это функциональный интерфейс с методом test (Object) для возврата логического значения. Этот интерфейс означает, что объект проверяется на истинность или ложь.

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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 + " ");
         }
      }
   }
}

Здесь мы передали интерфейс Predicate, который принимает единственный ввод и возвращает логическое значение.

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

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 представлена ​​новая концепция реализации методов по умолчанию в интерфейсах. Эта возможность добавлена ​​для обратной совместимости, так что старые интерфейсы могут использоваться для использования возможности лямбда-выражения Java 8.

Например, интерфейсы List или Collection не имеют объявления метода forEach. Таким образом, добавление такого метода просто нарушит реализацию фреймворка коллекции. Java 8 вводит метод по умолчанию, так что интерфейс List / Collection может иметь реализацию метода forEach по умолчанию, и класс, реализующий эти интерфейсы, не должен реализовывать то же самое.

Синтаксис

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

Несколько значений по умолчанию

При использовании функций по умолчанию в интерфейсах существует вероятность того, что класс реализует два интерфейса с одинаковыми методами по умолчанию. Следующий код объясняет, как можно разрешить эту неоднозначность.

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!");
   }
}

Первое решение - создать собственный метод, который переопределяет реализацию по умолчанию.

public class car implements vehicle, fourWheeler {

   public void print() {
      System.out.println("I am a four wheeler car vehicle!");
   }
}

Второе решение - вызвать метод по умолчанию для указанного интерфейса с помощью super.

public class car implements vehicle, fourWheeler {

   public void print() {
      vehicle.super.print();
   }
}

Статические методы по умолчанию

Интерфейс также может иметь статические вспомогательные методы, начиная с Java 8.

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

Пример метода по умолчанию

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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!");
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!

Stream - это новый абстрактный уровень, представленный в Java 8. Используя stream, вы можете декларативно обрабатывать данные, аналогично операторам SQL. Например, рассмотрим следующий оператор SQL.

SELECT max(salary), employee_id, employee_name FROM Employee

Вышеупомянутое выражение SQL автоматически возвращает данные о сотруднике с максимальной заработной платой без каких-либо вычислений со стороны разработчика. Используя структуру коллекций в Java, разработчик должен использовать циклы и выполнять повторные проверки. Еще одна проблема - эффективность; поскольку многоядерные процессоры легко доступны, разработчик Java должен написать параллельную обработку кода, которая может быть довольно подвержена ошибкам.

Чтобы решить такие проблемы, в Java 8 была представлена ​​концепция потока, которая позволяет разработчику декларативно обрабатывать данные и использовать многоядерную архитектуру без необходимости писать для нее какой-либо конкретный код.

Что такое Stream?

Stream представляет собой последовательность объектов из источника, который поддерживает агрегированные операции. Ниже приведены характеристики потока -

  • Sequence of elements- Поток предоставляет набор элементов определенного типа последовательным образом. Поток получает / вычисляет элементы по запросу. Он никогда не хранит элементы.

  • Source - Stream использует коллекции, массивы или ресурсы ввода-вывода в качестве источника ввода.

  • Aggregate operations - Stream поддерживает совокупные операции, такие как фильтр, отображение, ограничение, уменьшение, поиск, сопоставление и т. Д.

  • Pipelining- Большинство потоковых операций возвращают сам поток, так что их результат может быть конвейеризован. Эти операции называются промежуточными операциями, и их функция - принимать входные данные, обрабатывать их и возвращать выходные данные цели. Метод collect () - это терминальная операция, которая обычно присутствует в конце операции конвейерной обработки, чтобы отметить конец потока.

  • Automatic iterations - Потоковые операции выполняют внутренние итерации по предоставленным исходным элементам, в отличие от Коллекций, где требуется явная итерация.

Создание потоков

В Java 8 интерфейс Collection имеет два метода для создания Stream.

  • stream() - Возвращает последовательный поток, считая коллекцию его источником.

  • parallelStream() - Возвращает параллельный поток, считая коллекцию своим источником.

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

для каждого

Stream предоставил новый метод forEach для итерации каждого элемента потока. В следующем фрагменте кода показано, как напечатать 10 случайных чисел с помощью forEach.

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

карта

Метод map используется для сопоставления каждого элемента с соответствующим результатом. Следующий сегмент кода печатает уникальные квадраты чисел с помощью map.

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());

фильтр

Метод «фильтра» используется для исключения элементов на основе критерия. Следующий сегмент кода выводит количество пустых строк с помощью фильтра.

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

//get count of empty string
int count = strings.stream().filter(string -> string.isEmpty()).count();

предел

Метод limit используется для уменьшения размера потока. В следующем фрагменте кода показано, как напечатать 10 случайных чисел с помощью limit.

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

отсортированный

Метод сортировки используется для сортировки потока. В следующем фрагменте кода показано, как напечатать 10 случайных чисел в отсортированном порядке.

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

Параллельная обработка

parallelStream - это альтернатива stream для параллельной обработки. Взгляните на следующий сегмент кода, который выводит количество пустых строк с помощью 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();

Переключаться между последовательным и параллельным потоками очень просто.

Коллекционеры

Коллекторы используются для объединения результатов обработки элементов потока. Коллекторы можно использовать для возврата списка или строки.

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);

Статистика

В Java 8 введены сборщики статистики для расчета всей статистики при выполнении потоковой обработки.

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());

Пример потока

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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();
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Это должно дать следующий результат -

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

Необязательный - это объект-контейнер, используемый для содержания ненулевых объектов. Необязательный объект используется для представления null с отсутствующим значением. В этом классе есть различные служебные методы, которые позволяют коду обрабатывать значения как «доступные» или «недоступные» вместо проверки нулевых значений. Он представлен в Java 8 и похож на необязательный в Guava.

Объявление класса

Ниже приводится декларация для java.util.Optional<T> класс -

public final class Optional<T> extends Object

Метод класса

Sr.No. Метод и описание
1

static <T> Optional<T> empty()

Возвращает пустой необязательный экземпляр.

2

boolean equals(Object obj)

Указывает, равен ли какой-либо другой объект этому Необязательному.

3

Optional<T> filter(Predicate<? super <T> predicate)

Если значение присутствует и значение соответствует заданному предикату, он возвращает Optional, описывающий значение, в противном случае возвращает пустой Optional.

4

<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

Если значение присутствует, он применяет к нему предоставленную опциональную функцию сопоставления, возвращает этот результат, в противном случае возвращает пустой Optional.

5

T get()

Если значение присутствует в этом Optional, возвращает значение, в противном случае выбрасывает NoSuchElementException.

6

int hashCode()

Возвращает значение хэш-кода текущего значения, если оно есть, или 0 (ноль), если значение отсутствует.

7

void ifPresent(Consumer<? super T> consumer)

Если значение присутствует, он вызывает указанного потребителя со значением, в противном случае ничего не делает.

8

boolean isPresent()

Возвращает true, если значение присутствует, иначе false.

9

<U>Optional<U> map(Function<? super T,? extends U> mapper)

Если значение присутствует, применяет к нему предоставленную функцию сопоставления, а если результат не равен нулю, возвращает Optional, описывающий результат.

10

static <T> Optional<T> of(T value)

Возвращает Optional с указанным текущим ненулевым значением.

11

static <T> Optional<T> ofNullable(T value)

Возвращает Optional, описывающий указанное значение, если не равно NULL, в противном случае возвращает пустой Optional.

12

T orElse(T other)

Возвращает значение, если оно присутствует, в противном случае возвращает другое.

13

T orElseGet(Supplier<? extends T> other)

Возвращает значение, если оно присутствует, в противном случае вызывает другое и возвращает результат этого вызова.

14

<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

Возвращает содержащееся значение, если оно присутствует, в противном случае вызывает исключение, которое должно быть создано предоставленным поставщиком.

15

String toString()

Возвращает непустое строковое представление этого Необязательного, подходящего для отладки.

Этот класс наследует методы от следующего класса -

  • java.lang.Object

Необязательный пример

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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;
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

First parameter is present: false
Second parameter is present: true
10

В Java 8, Nashorn, представлен значительно улучшенный движок javascript, который заменяет существующий Rhino. Nashorn обеспечивает в 2-10 раз лучшую производительность, поскольку он напрямую компилирует код в памяти и передает байт-код в JVM. Nashorn использует функцию динамического вызова, представленную в Java 7, для повышения производительности.

jjs

Для движка Nashorn JAVA 8 представляет новый инструмент командной строки, jjs, для выполнения кодов javascript на консоли.

Интерпретация файла js

Создайте и сохраните файл sample.js в папке c: \> JAVA.

sample.js

print('Hello World!');

Откройте консоль и используйте следующую команду.

C:\JAVA>jjs sample.js

Он выдаст следующий результат:

Hello World!

jjs в интерактивном режиме

Откройте консоль и используйте следующую команду.

C:\JAVA>jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>

Передавать аргументы

Откройте консоль и используйте следующую команду.

C:\JAVA> jjs -- a b c
jjs> print('letters: ' +arguments.join(", "))
letters: a, b, c
jjs>

Вызов JavaScript из Java

Используя ScriptEngineManager, код JavaScript можно вызывать и интерпретировать на Java.

пример

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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());
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Это должно дать следующий результат -

Mahesh
12

Вызов Java из JavaScript

В следующем примере объясняется, как импортировать и использовать классы Java в сценарии Java.

Создать и сохранить sample.js в папке c: \> JAVA.

sample.js

var BigDecimal = Java.type('java.math.BigDecimal');

function calculate(amount, percentage) {

   var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide(
      new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
   
   return result.toPlainString();
}
var result = calculate(568000000000000000023,13.9);
print(result);

Откройте консоль и используйте следующую команду.

C:\JAVA>jjs sample.js

Он должен выдать следующий результат -

78952000000000000003.20

В Java 8 представлен новый API даты и времени, который устраняет следующие недостатки старого API даты и времени.

  • Not thread safe- java.util.Date не является потокобезопасным, поэтому разработчикам приходится иметь дело с проблемой параллелизма при использовании date. Новый API даты и времени является неизменным и не имеет методов установки.

  • Poor design- Дата по умолчанию начинается с 1900, месяц начинается с 1, а день начинается с 0, поэтому единообразия нет. Старый API имел менее прямые методы для операций с датами. Новый API предоставляет множество служебных методов для таких операций.

  • Difficult time zone handling- Разработчикам пришлось написать много кода для решения проблем с часовыми поясами. Новый API был разработан с учетом предметно-ориентированного дизайна.

Java 8 представляет новый API даты и времени в пакете java.time. Ниже приведены некоторые из важных классов, представленных в пакете java.time.

  • Local - Упрощенный API даты и времени без сложности обработки часовых поясов.

  • Zoned - Специализированный API даты и времени для работы с различными часовыми поясами.

Локальный API даты и времени

Классы LocalDate / LocalTime и LocalDateTime упрощают разработку, когда часовые пояса не требуются. Посмотрим на них в действии.

Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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);
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

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

Зонированный API даты и времени

При учете часового пояса следует использовать зонированный API даты и времени. Давайте посмотрим на них в действии.

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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);
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

date1: 2007-12-03T10:15:30+05:00[Asia/Karachi]
ZoneId: Europe/Paris
CurrentZone: Etc/UTC

Chrono Units Enum

Перечисление java.time.temporal.ChronoUnit добавлено в Java 8 для замены целочисленных значений, используемых в старом API для представления дня, месяца и т. д. Давайте посмотрим на них в действии.

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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);
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Это должно дать следующий результат -

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

Период и продолжительность

В Java 8 представлены два специализированных класса для работы с разницей во времени.

  • Period - Он имеет дело с количеством времени на основе даты.

  • Duration - Это касается количества времени, зависящего от времени.

Давайте посмотрим на них в действии.

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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);
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

Current date: 2014-12-10
Next month: 2015-01-10
Period: P-1M
Duration: PT2H

Временные Настройщики

TemporalAdjuster используется для вычисления даты. Например, получите «Вторая суббота месяца» или «Следующий вторник». Давайте посмотрим на них в действии.

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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);
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Это должно дать следующий результат -

Current date: 2014-12-10
Next Tuesday on : 2014-12-16
Second Saturday on : 2014-12-13

Обратная совместимость

К исходным объектам Date и Calendar добавляется метод toInstant (), который можно использовать для их преобразования в новый API даты и времени. Используйте метод ofInstant (Insant, ZoneId), чтобы получить объект LocalDateTime или ZonedDateTime. Давайте посмотрим на них в действии.

Создайте следующую программу Java с помощью любого редактора по вашему выбору, например, C: \> JAVA.

Java8Tester.java

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);
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

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 наконец получил свое. В Java 8 теперь есть встроенный кодировщик и декодер для кодирования Base64. В Java 8 мы можем использовать три типа кодировки Base64.

  • Simple- Вывод сопоставляется с набором символов, лежащих в A-Za-z0-9 + /. Кодировщик не добавляет перевод строки в вывод, а декодер отклоняет любой символ, кроме A-Za-z0-9 + /.

  • URL- Вывод отображается на набор символов, лежащих в A-Za-z0-9 + _. Выходные данные безопасны для URL и имени файла.

  • MIME- Вывод отображается в дружественный формат MIME. Вывод представлен в строках не более чем по 76 символов каждая, и в качестве разделителя строк используется возврат каретки '\ r', за которым следует перевод строки '\ n'. В конце закодированного вывода нет разделителя строк.

Вложенные классы

Sr.No. Вложенный класс и описание
1

static class Base64.Decoder

Этот класс реализует декодер для декодирования байтовых данных с использованием схемы кодирования Base64, как указано в RFC 4648 и RFC 2045.

2

static class Base64.Encoder

Этот класс реализует кодировщик для кодирования байтовых данных с использованием схемы кодирования Base64, как указано в RFC 4648 и RFC 2045.

Методы

Sr.No. Название и описание метода
1

static Base64.Decoder getDecoder()

Возвращает Base64.Decoder, который декодирует с использованием схемы кодирования base64 базового типа.

2

static Base64.Encoder getEncoder()

Возвращает Base64.Encoder, который кодирует с использованием схемы кодирования base64 базового типа.

3

static Base64.Decoder getMimeDecoder()

Возвращает Base64.Decoder, который декодирует с использованием схемы декодирования base64 типа MIME.

4

static Base64.Encoder getMimeEncoder()

Возвращает Base64.Encoder, который кодирует с использованием схемы кодирования base64 типа MIME.

5

static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)

Возвращает Base64.Encoder, который кодирует с использованием схемы кодирования base64 типа MIME с указанной длиной строки и разделителями строк.

6

static Base64.Decoder getUrlDecoder()

Возвращает Base64.Decoder, который декодирует с использованием схемы кодирования base64 безопасного типа URL и имени файла.

7

static Base64.Encoder getUrlEncoder()

Возвращает Base64.Encoder, который кодирует с использованием схемы кодирования base64 безопасного типа URL и имени файла.

Унаследованные методы

Этот класс наследует методы от следующего класса -

  • java.lang.Object

Пример Base64

Создайте следующую программу Java, используя любой редактор по вашему выбору, например, C: /> JAVA.

Java8Tester.java

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());
      }
   }
}

Проверить результат

Скомпилируйте класс, используя javac компилятор следующим образом -

C:\JAVA>javac Java8Tester.java

Теперь запустите Java8Tester следующим образом -

C:\JAVA>java Java8Tester

Он должен выдать следующий результат -

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