자바 8-퀵 가이드

JAVA 8은 JAVA 프로그래밍 언어 개발의 주요 기능 릴리스입니다. 초기 버전은 2014 년 3 월 18 일에 릴리스되었습니다. Java 8 릴리스를 통해 Java는 기능 프로그래밍, 새 JavaScript 엔진, 날짜 시간 조작을위한 새 API, 새 스트리밍 API 등에 대한 지원을 제공했습니다.

새로운 기능

  • Lambda expression − Java에 기능 처리 기능을 추가합니다.

  • Method references− 함수를 직접 호출하는 대신 이름으로 참조. 매개 변수로 함수 사용.

  • Default method − 기본 메소드 구현을위한 인터페이스.

  • New tools − 새로운 컴파일러 도구 및 유틸리티가 'jdeps'와 같이 추가되어 종속성을 파악합니다.

  • Stream API − 파이프 라인 처리를 용이하게하는 새로운 스트림 API.

  • Date Time API − 향상된 날짜 시간 API.

  • Optional − Null 값을 올바르게 처리하기위한 모범 사례 강조.

  • Nashorn, JavaScript Engine − JavaScript 코드를 실행하기위한 Java 기반 엔진.

다음 코드 스 니펫을 고려하십시오.

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 용 경로 설정

c : \ Program Files \ java \ jdk 디렉토리에 Java를 설치했다고 가정합니다.

  • '내 컴퓨터'를 마우스 오른쪽 버튼으로 클릭하고 '속성'을 선택합니다.

  • '고급'탭에서 '환경 변수'버튼을 클릭합니다.

  • 이제 Java 실행 파일의 경로도 포함하도록 'Path'변수를 변경하십시오. 예를 들어 현재 경로가 'C : \ WINDOWS \ SYSTEM32'로 설정된 경우 경로를 'C : \ WINDOWS \ SYSTEM32; c : \ Program Files \ java \ jdk \ bin'으로 변경합니다.

Windows 95 / 98 / ME 용 경로 설정

c : \ Program Files \ java \ jdk 디렉토리에 Java를 설치했다고 가정합니다.

  • 'C : \ autoexec.bat'파일을 편집하고 끝에 다음 줄을 추가합니다.

    SET PATH = % PATH %; C : \ Program Files \ java \ jdk \ bin

Linux, UNIX, Solaris, FreeBSD에 대한 경로 설정

환경 변수 PATH는 Java 바이너리가 설치된 위치를 가리 키도록 설정되어야합니다. 이 작업을 수행하는 데 문제가 있으면 쉘 문서를 참조하십시오.

예를 들어 bash를 셸로 사용하는 경우 '.bashrc : export PATH = / path / to / java : $ PATH'끝에 다음 줄을 추가합니다.

인기있는 자바 편집자

Java 프로그램을 작성하려면 텍스트 편집기가 필요합니다. 시장에는 훨씬 더 정교한 IDE가 있습니다. 그러나 지금은 다음 중 하나를 고려할 수 있습니다.

  • Notepad − Windows 컴퓨터에서는 메모장 (이 자습서에 권장 됨) 또는 TextPad와 같은 간단한 텍스트 편집기를 사용할 수 있습니다.

  • Netbeans− 오픈 소스이며 무료 인 Java IDE입니다. 다음에서 다운로드 할 수 있습니다.https://netbeans.org/index.html.

  • Eclipse − 또한 Eclipse 오픈 소스 커뮤니티에서 개발 한 Java IDE이며 다음에서 다운로드 할 수 있습니다. https://www.eclipse.org/.

Lambda 표현식은 Java 8에 도입되었으며 Java 8의 가장 큰 기능으로 선전됩니다. Lambda 표현식은 함수형 프로그래밍을 용이하게하고 개발을 많이 단순화합니다.

통사론

람다 식의 특징은 다음과 같습니다.

parameter -> expression body

다음은 람다 식의 중요한 특성입니다.

  • Optional type declaration− 매개 변수 유형을 선언 할 필요가 없습니다. 컴파일러는 매개 변수 값에서 동일하게 추론 할 수 있습니다.

  • Optional parenthesis around parameter− 괄호 안에 단일 매개 변수를 선언 할 필요가 없습니다. 매개 변수가 여러 개인 경우 괄호가 필요합니다.

  • Optional curly braces − 본문에 단일 문이 포함 된 경우 식 본문에 중괄호를 사용할 필요가 없습니다.

  • Optional return keyword− 컴파일러는 본문에 값을 반환하는 단일 표현식이있는 경우 자동으로 값을 반환합니다. 식이 값을 반환 함을 나타내려면 중괄호가 필요합니다.

람다 식 예제

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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

다음은 위의 예에서 고려해야 할 중요한 사항입니다.

  • Lambda 표현식은 기본적으로 기능 인터페이스의 인라인 구현, 즉 단일 메서드 만있는 인터페이스를 정의하는 데 사용됩니다. 위의 예에서는 MathOperation 인터페이스의 연산 방법을 정의하기 위해 다양한 유형의 람다 식을 사용했습니다. 그런 다음 GreetingService의 sayMessage 구현을 정의했습니다.

  • Lambda 표현식은 익명 클래스의 필요성을 제거하고 Java에 매우 간단하면서도 강력한 기능적 프로그래밍 기능을 제공합니다.

범위

람다 식을 사용하면 최종 변수 또는 효과적으로 최종 변수 (한 번만 할당 됨)를 참조 할 수 있습니다. 변수에 두 번째로 값이 할당되면 Lambda 식에서 컴파일 오류가 발생합니다.

범위 예

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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)

방법 참조 예

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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

기능적 인터페이스에는 표시 할 단일 기능이 있습니다. 예를 들어 비교 목적으로 단일 메소드 'compareTo'가있는 Comparable 인터페이스가 사용됩니다. Java 8은 람다 식에서 광범위하게 사용되는 많은 기능 인터페이스를 정의했습니다. 다음은 java.util.Function 패키지에 정의 된 기능 인터페이스 목록입니다.

Sr. 아니. 인터페이스 및 설명
1

BiConsumer<T,U>

두 개의 입력 인수를 받아들이고 결과를 반환하지 않는 작업을 나타냅니다.

2

BiFunction<T,U,R>

두 개의 인수를 받아들이고 결과를 생성하는 함수를 나타냅니다.

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

두 개의 int 값 피연산자에 대한 연산을 나타내며 int 값 결과를 생성합니다.

17

IntConsumer

단일 int 값 인수를 받아들이고 결과를 반환하지 않는 작업을 나타냅니다.

18

IntFunction<R>

int 값 인수를 받아들이고 결과를 생성하는 함수를 나타냅니다.

19

IntPredicate

하나의 int 값 인수의 조건 자 (부울 값 함수)를 나타냅니다.

20

IntSupplier

int 값 결과의 공급자를 나타냅니다.

21

IntToDoubleFunction

정수 값 인수를 받아들이고 이중 값 결과를 생성하는 함수를 나타냅니다.

22

IntToLongFunction

int 값 인수를 받아들이고 긴 값 결과를 생성하는 함수를 나타냅니다.

23

IntUnaryOperator

int 값 결과를 생성하는 단일 int 값 피연산자에 대한 연산을 나타냅니다.

24

LongBinaryOperator

두 개의 긴 값 피연산자에 대한 연산을 나타내며 긴 값 결과를 생성합니다.

25

LongConsumer

단일 긴 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다.

26

LongFunction<R>

긴 값의 인수를 받아들이고 결과를 생성하는 함수를 나타냅니다.

27

LongPredicate

긴 값 인수 하나의 조건 자 (부울 값 함수)를 나타냅니다.

28

LongSupplier

장기 가치 결과의 공급자를 나타냅니다.

29

LongToDoubleFunction

긴 값 인수를 받아들이고 이중 값 결과를 생성하는 함수를 나타냅니다.

30

LongToIntFunction

긴 값 인수를 허용하고 정수 값 결과를 생성하는 함수를 나타냅니다.

31

LongUnaryOperator

긴 값 결과를 생성하는 단일 긴 값 피연산자에 대한 연산을 나타냅니다.

32

ObjDoubleConsumer<T>

개체 값 및 이중 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다.

33

ObjIntConsumer<T>

개체 값 및 int 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다.

34

ObjLongConsumer<T>

개체 값 및 긴 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다.

35

Predicate<T>

한 인수의 조건 자 (부울 값 함수)를 나타냅니다.

36

Supplier<T>

결과 공급자를 나타냅니다.

37

ToDoubleBiFunction<T,U>

두 개의 인수를 받아들이고 이중 값 결과를 생성하는 함수를 나타냅니다.

38

ToDoubleFunction<T>

이중 값 결과를 생성하는 함수를 나타냅니다.

39

ToIntBiFunction<T,U>

두 개의 인수를 받아들이고 정수 값 결과를 생성하는 함수를 나타냅니다.

40

ToIntFunction<T>

int 값 결과를 생성하는 함수를 나타냅니다.

41

ToLongBiFunction<T,U>

두 개의 인수를 받아들이고 긴 값 결과를 생성하는 함수를 나타냅니다.

42

ToLongFunction<T>

긴 값 결과를 생성하는 함수를 나타냅니다.

43

UnaryOperator<T>

피연산자와 동일한 유형의 결과를 생성하는 단일 피연산자에 대한 연산을 나타냅니다.

기능적 인터페이스 예

Predicate <T> 인터페이스는 부울 값을 반환하는 test (Object) 메서드가있는 기능적 인터페이스입니다. 이 인터페이스는 개체가 참 또는 거짓으로 테스트되었음을 ​​나타냅니다.

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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 + " ");
         }
      }
   }
}

여기서 우리는 단일 입력을 받고 Boolean을 반환하는 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!!!");
   }
}

기본 방법 예

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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은 집계 작업을 지원하는 소스의 개체 시퀀스를 나타냅니다. 다음은 스트림의 특성입니다-

  • Sequence of elements− 스트림은 특정 유형의 요소 집합을 순차적으로 제공합니다. 스트림은 요청시 요소를 가져 오거나 계산합니다. 요소를 저장하지 않습니다.

  • Source − 스트림은 컬렉션, 배열 또는 I / O 리소스를 입력 소스로 사용합니다.

  • 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'를 제공했습니다. 다음 코드 세그먼트는 forEach를 사용하여 10 개의 난수를 인쇄하는 방법을 보여줍니다.

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 개의 난수를 인쇄하는 방법을 보여줍니다.

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

분류

'sorted'방법은 스트림을 정렬하는 데 사용됩니다. 다음 코드 세그먼트는 10 개의 난수를 정렬 된 순서로 인쇄하는 방법을 보여줍니다.

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

병렬 처리

parallelStream은 병렬 처리를위한 스트림의 대안입니다. 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());

스트림 예

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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이 아닌 개체를 포함하는 데 사용되는 컨테이너 개체입니다. 선택적 개체는 값이없는 null을 나타내는 데 사용됩니다. 이 클래스에는 코드가 null 값을 확인하는 대신 '사용 가능'또는 '사용 불가'로 값을 처리 할 수 ​​있도록하는 다양한 유틸리티 메서드가 있습니다. Java 8에 도입되었으며 Guava의 Optional과 유사합니다.

클래스 선언

다음은에 대한 선언입니다. java.util.Optional<T> 클래스-

public final class Optional<T> extends Object

수업 방법

Sr. 아니. 방법 및 설명
1

static <T> Optional<T> empty()

빈 선택적 인스턴스를 반환합니다.

2

boolean equals(Object obj)

다른 개체가이 옵션과 "같은"지 여부를 나타냅니다.

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

값이 있고 값이 주어진 술어와 일치하면 값을 설명하는 Optional을 반환하고, 그렇지 않으면 빈 Optional을 반환합니다.

4

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

값이 있으면 제공된 Optional-bearing 매핑 함수를 여기에 적용하고 해당 결과를 반환하고 그렇지 않으면 빈 Optional을 반환합니다.

5

T get()

이 Optional에 값이 있으면 값을 반환하고, 그렇지 않으면 NoSuchElementException을 throw합니다.

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)

값이 있으면 제공된 매핑 함수를 적용하고 결과가 null이 아니면 결과를 설명하는 Optional을 반환합니다.

10

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

지정된 현재 null이 아닌 값을 사용하여 Optional을 반환합니다.

11

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

null이 아닌 경우 지정된 값을 설명하는 Optional을 반환하고, 그렇지 않으면 빈 Optional을 반환합니다.

12

T orElse(T other)

값이 있으면 반환하고, 그렇지 않으면 다른 값을 반환합니다.

13

T orElseGet(Supplier<? extends T> other)

존재하는 경우 값을 반환하고, 그렇지 않으면 다른 항목을 호출하고 해당 호출의 결과를 반환합니다.

14

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

포함 된 값 (있는 경우)을 반환하고, 그렇지 않으면 제공된 공급자가 생성 할 예외를 throw합니다.

15

String toString()

디버깅에 적합한이 Optional의 비어 있지 않은 문자열 표현을 리턴합니다.

이 클래스는 다음 클래스에서 메서드를 상속합니다-

  • java.lang.Object

선택적 예

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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에서는 기존 Rhino를 대체하기 위해 훨씬 향상된 자바 스크립트 엔진 인 Nashorn이 도입되었습니다. Nashorn은 메모리에서 코드를 직접 컴파일하고 바이트 코드를 JVM에 전달하므로 2 ~ 10 배 더 나은 성능을 제공합니다. Nashorn은 성능 향상을 위해 Java 7에 도입 된 invoke dynamics 기능을 사용합니다.

jjs

Nashorn 엔진의 경우 JAVA 8에는 새로운 명령 줄 도구가 도입되었습니다. jjs, 콘솔에서 자바 스크립트 코드를 실행합니다.

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>

자바에서 자바 스크립트 호출

ScriptEngineManager를 사용하면 자바에서 자바 스크립트 코드를 호출하고 해석 할 수 있습니다.

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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

JavaScript에서 Java 호출

다음 예제는 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는 스레드로부터 안전하지 않으므로 개발자는 날짜를 사용하는 동안 동시성 문제를 처리해야합니다. 새 날짜-시간 API는 변경할 수 없으며 setter 메서드가 없습니다.

  • Poor design− 기본 날짜는 1900부터 시작하고 월은 1부터 시작하며 일은 0부터 시작하므로 균일 성이 없습니다. 이전 API에는 날짜 작업에 대한 직접적인 방법이 적었습니다. 새 API는 이러한 작업을위한 다양한 유틸리티 메서드를 제공합니다.

  • Difficult time zone handling− 개발자는 시간대 문제를 처리하기 위해 많은 코드를 작성해야했습니다. 새로운 API는 도메인 별 디자인을 염두에두고 개발되었습니다.

Java 8에는 java.time 패키지 아래에 새로운 날짜-시간 API가 도입되었습니다. 다음은 java.time 패키지에 도입 된 몇 가지 중요한 클래스입니다.

  • Local − 복잡한 시간대 처리없이 단순화 된 날짜-시간 API.

  • Zoned − 다양한 시간대를 처리하기위한 특화된 날짜-시간 API.

로컬 날짜-시간 API

LocalDate / LocalTime 및 LocalDateTime 클래스는 시간대가 필요하지 않은 개발을 단순화합니다. 그들이 행동하는 모습을 봅시다.

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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

Zoned Date-Time API

시간대가 고려 될 때 구역화 된 날짜-시간 API가 사용됩니다. 그들이 행동하는 모습을 보자.

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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 단위 열거 형

java.time.temporal.ChronoUnit 열거 형이 Java 8에 추가되어 이전 API에서 일, 월 등을 나타내는 데 사용 된 정수 값을 대체합니다. 실제로 작동하는지 살펴 보겠습니다.

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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 − 시간 기반의 시간을 다룹니다.

그들이 행동하는 모습을 보자.

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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는 날짜 수학을 수행하는 데 사용됩니다. 예를 들어 "매월 두 번째 토요일"또는 "다음 화요일"을 가져옵니다. 그들이 행동하는 모습을 보자.

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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

하위 호환성

toInstant () 메서드가 원래 Date 및 Calendar 객체에 추가되어이를 새 Date-Time API로 변환하는 데 사용할 수 있습니다. ofInstant (Insant, ZoneId) 메서드를 사용하여 LocalDateTime 또는 ZonedDateTime 개체를 가져옵니다. 그들이 행동하는 모습을 보자.

C : \> JAVA에서 원하는 편집기를 사용하여 다음 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. 아니. 중첩 된 클래스 및 설명
1

static class Base64.Decoder

이 클래스는 RFC 4648 및 RFC 2045에 지정된 Base64 인코딩 체계를 사용하여 바이트 데이터를 디코딩하기위한 디코더를 구현합니다.

2

static class Base64.Encoder

이 클래스는 RFC 4648 및 RFC 2045에 지정된 Base64 인코딩 체계를 사용하여 바이트 데이터를 인코딩하기위한 인코더를 구현합니다.

행동 양식

Sr. 아니. 방법 이름 및 설명
1

static Base64.Decoder getDecoder()

기본 유형 base64 인코딩 체계를 사용하여 디코딩하는 Base64.Decoder를 반환합니다.

2

static Base64.Encoder getEncoder()

기본 형식 base64 인코딩 체계를 사용하여 인코딩하는 Base64.Encoder를 반환합니다.

static Base64.Decoder getMimeDecoder()

MIME 유형 base64 디코딩 체계를 사용하여 디코딩하는 Base64.Decoder를 반환합니다.

4

static Base64.Encoder getMimeEncoder()

MIME 유형 base64 인코딩 체계를 사용하여 인코딩하는 Base64.Encoder를 반환합니다.

5

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

지정된 줄 길이와 줄 구분 기호가있는 MIME 유형 base64 인코딩 체계를 사용하여 인코딩하는 Base64.Encoder를 반환합니다.

6

static Base64.Decoder getUrlDecoder()

URL 및 파일 이름 안전 유형 base64 인코딩 체계를 사용하여 디코딩하는 Base64.Decoder를 반환합니다.

7

static Base64.Encoder getUrlEncoder()

URL 및 파일 이름 안전 유형 base64 인코딩 체계를 사용하여 인코딩하는 Base64.Encoder를 반환합니다.

상속 된 메서드

이 클래스는 다음 클래스에서 메서드를 상속합니다-

  • java.lang.Object

Base64 예

C : /> JAVA에서 원하는 편집기를 사용하여 다음 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