java
JAVA 8은 JAVA 프로그래밍 언어 개발의 주요 기능 릴리스입니다. 초기 버전은 2014년 3월 18일에 릴리스되었습니다. Java 8 릴리스와 함께 Java는 함수형 프로그래밍, 새로운 JavaScript 엔진, 날짜 시간 조작을 위한 새로운 API, 새로운 스트리밍 API 등을 지원했습니다.
람다 식 − Java에 기능적 처리 기능을 추가합니다.
방법 참조 − 직접 호출하는 대신 이름으로 함수를 참조합니다. 함수를 매개변수로 사용.
기본 방법 − 기본 메소드 구현을 위한 인터페이스.
새 도구 − 종속성을 파악하기 위해 'jdeps'와 같은 새로운 컴파일러 도구 및 유틸리티가 추가되었습니다.
스트림 API − 파이프라인 처리를 용이하게 하는 새로운 스트림 API.
날짜 시간 API − 향상된 날짜 시간 API.
선택 사항 − null 값을 적절하게 처리하기 위한 모범 사례 강조
나스혼, 자바스크립트 엔진 − 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를 설치했으면 올바른 설치 디렉토리를 가리키도록 환경 변수를 설정해야 합니다.
c:\Program Files\java\jdk 디렉토리에 Java를 설치했다고 가정 -
'내 컴퓨터'를 마우스 오른쪽 버튼으로 클릭하고 '속성'을 선택합니다.
'고급' 탭에서 '환경 변수' 버튼을 클릭합니다.
이제 'Path' 변수를 변경하여 Java 실행 파일의 경로도 포함하도록 합니다. 예를 들어 현재 경로가 'C:\WINDOWS\SYSTEM32'로 설정되어 있으면 경로를 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'으로 변경합니다.
c:\Program Files\java\jdk 디렉토리에 Java를 설치했다고 가정 -
'C:\autoexec.bat' 파일을 편집하고 끝에 다음 줄을 추가하십시오 -
SET 경로=%PATH%;C:\Program Files\java\jdk\bin
환경 변수 PATH는 Java 바이너리가 설치된 위치를 가리키도록 설정해야 합니다. 이 작업을 수행하는 데 문제가 있으면 셸 설명서를 참조하세요.
예를 들어, bash를 셸로 사용하는 경우 '.bashrc:export PATH=/path/to/java:$PATH'
끝에 다음 줄을 추가합니다.Java 프로그램을 작성하려면 텍스트 편집기가 필요합니다. 시장에는 훨씬 더 정교한 IDE가 있습니다. 그러나 지금은 다음 중 하나를 고려할 수 있습니다. -
메모장 − Windows 시스템에서는 메모장(이 튜토리얼에서 권장) 또는 TextPad와 같은 간단한 텍스트 편집기를 사용할 수 있습니다.
넷빈 − 오픈 소스이며 무료인 Java IDE입니다. https://netbeans.org/index.html에서 다운로드할 수 있습니다.
일식 − Eclipse 오픈소스 커뮤니티에서 개발한 Java IDE이기도 하며 https://www.eclipse.org/에서 다운로드할 수 있습니다.
Lambda 표현식은 Java 8에 도입되었으며 Java 8의 가장 큰 기능으로 선전됩니다. Lambda 표현식은 함수형 프로그래밍을 용이하게 하고 개발을 크게 단순화합니다.
람다 식의 특징은 다음 구문입니다.
parameter -> expression body
다음은 람다 식의 중요한 특성입니다.
선택적 유형 선언 − 매개변수의 유형을 선언할 필요가 없습니다. 컴파일러는 매개변수 값에서 동일하게 추론할 수 있습니다.
매개변수 주위의 선택적 괄호 − 괄호 안에 단일 매개변수를 선언할 필요가 없습니다. 여러 매개변수의 경우 괄호가 필요합니다.
선택 사항 중괄호 − 본문에 하나의 명령문이 포함된 경우 표현식 본문에 중괄호를 사용할 필요가 없습니다.
선택적 반환 키워드 − 본문에 값을 반환하는 단일 표현식이 있는 경우 컴파일러는 자동으로 값을 반환합니다. 표현식이 값을 반환함을 나타내려면 중괄호가 필요합니다.
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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 인터페이스의 연산 방식을 정의하기 위해 다양한 종류의 람다 표현식을 사용했습니다. 그런 다음 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
메서드 참조는 이름으로 메서드를 가리키는 데 도움이 됩니다. 메소드 참조는 "::" 기호를 사용하여 설명됩니다. 메소드 참조는 다음 유형의 메소드를 가리키는 데 사용할 수 있습니다. -
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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 패키지에 정의된 기능 인터페이스 목록입니다.
시니어 번호 | 인터페이스 및 설명 |
---|---|
1 |
바이컨슈머 두 개의 입력 인수를 받아들이고 결과를 반환하지 않는 작업을 나타냅니다. |
2 |
바이펑션 두 개의 인수를 받아 결과를 생성하는 함수를 나타냅니다. |
3 |
이진 연산자 동일한 유형의 두 피연산자에 대한 연산을 나타내며 피연산자와 동일한 유형의 결과를 생성합니다. |
4 |
BiPredicate 두 인수의 술어(부울 값 함수)를 나타냅니다. |
5 | 부울 공급업체 부울 값 결과의 공급자를 나타냅니다. |
6 |
소비자 단일 입력 인수를 받아들이고 결과를 반환하지 않는 작업을 나타냅니다. |
7 | 이중 바이너리 연산자 두 개의 이중 값 피연산자에 대한 연산을 나타내며 이중 값 결과를 생성합니다. |
8 | 이중 소비자 단일 이중 값 인수를 허용하고 결과를 반환하지 않는 연산을 나타냅니다. |
9 |
이중 기능 이중 값 인수를 허용하고 결과를 생성하는 함수를 나타냅니다. |
10 | 이중 술어 하나의 이중 값 인수의 술어(부울 값 함수)를 나타냅니다. |
11 | 이중 공급업체 이중 가치 결과의 공급자를 나타냅니다. |
12 | DoubleToIntFunction 이중 값 인수를 허용하고 int 값 결과를 생성하는 함수를 나타냅니다. |
13 | DoubleToLongFunction 이중 값 인수를 허용하고 긴 값 결과를 생성하는 함수를 나타냅니다. |
14 | DoubleUnaryOperator 이중 값 결과를 생성하는 단일 이중 값 피연산자에 대한 연산을 나타냅니다. |
15 |
기능 하나의 인수를 받아 결과를 생성하는 함수를 나타냅니다. |
16 | IntBinaryOperator 두 개의 int 값 피연산자에 대한 연산을 나타내며 int 값 결과를 생성합니다. |
17 | IntConsumer 단일 int 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다. |
18 |
IntFunction int 값 인수를 받아들이고 결과를 생성하는 함수를 나타냅니다. |
19 | IntPredicate 하나의 int 값 인수의 술어(부울 값 함수)를 나타냅니다. |
20 | IntSupplier 정수 값 결과의 공급자를 나타냅니다. |
21 | IntToDoubleFunction int 값 인수를 허용하고 이중 값 결과를 생성하는 함수를 나타냅니다. |
22 | IntToLongFunction int 값 인수를 받아들이고 긴 값 결과를 생성하는 함수를 나타냅니다. |
23 | IntUnaryOperator int 값 결과를 생성하는 단일 int 값 피연산자에 대한 연산을 나타냅니다. |
24 | LongBinaryOperator 두 개의 긴 값 피연산자에 대한 연산을 나타내며 긴 값의 결과를 생성합니다. |
25 | 장기 소비자 하나의 긴 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다. |
26 |
장기능 긴 값의 인수를 받아 결과를 생성하는 함수를 나타냅니다. |
27 | LongPredicate 하나의 긴 값 인수의 술어(부울 값 함수)를 나타냅니다. |
28 | 장기 공급업체 오랫동안 가치 있는 결과를 제공하는 공급자를 나타냅니다. |
29 | LongToDoubleFunction 긴 값 인수를 허용하고 이중 값 결과를 생성하는 함수를 나타냅니다. |
30 | LongToIntFunction 긴 값 인수를 허용하고 int 값 결과를 생성하는 함수를 나타냅니다. |
31 | LongUnaryOperator 긴 값 결과를 생성하는 단일 긴 값 피연산자에 대한 연산을 나타냅니다. |
32 |
ObjDoubleConsumer 개체 값 및 이중 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다. |
33 |
ObjIntConsumer 개체 값 및 int 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다. |
34 |
ObjLongConsumer 개체 값 및 긴 값 인수를 허용하고 결과를 반환하지 않는 작업을 나타냅니다. |
35 |
술어 한 인수의 술어(부울 값 함수)를 나타냅니다. |
36 |
공급업체 결과 공급자를 나타냅니다. |
37 |
ToDoubleBiFunction 두 개의 인수를 허용하고 이중 값 결과를 생성하는 함수를 나타냅니다. |
38 |
ToDoubleFunction 이중 값 결과를 생성하는 함수를 나타냅니다. |
39 |
ToIntBiFunction 두 개의 인수를 허용하고 int 값 결과를 생성하는 함수를 나타냅니다. |
40 |
ToIntFunction 정수 값 결과를 생성하는 함수를 나타냅니다. |
41 |
ToLongBiFunction 두 개의 인수를 허용하고 긴 값의 결과를 생성하는 함수를 나타냅니다. |
42 |
ToLongFunction 긴 값을 생성하는 함수를 나타냅니다. |
43 |
단항 연산자 피연산자와 동일한 유형의 결과를 생성하는 단일 피연산자에 대한 연산을 나타냅니다. |
술어
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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!!!"); } }
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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!
스트림은 Java 8에 도입된 새로운 추상 계층입니다. 스트림을 사용하면 SQL 문과 유사한 선언적 방식으로 데이터를 처리할 수 있습니다. 예를 들어, 다음 SQL 문을 고려하십시오.
SELECT max(salary), employee_id, employee_name FROM Employee
위의 SQL 표현식은 개발자 측에서 계산하지 않고 최대 급여 직원의 세부 정보를 자동으로 반환합니다. 개발자는 Java의 컬렉션 프레임워크를 사용하여 루프를 사용하고 반복적으로 확인해야 합니다. 또 다른 문제는 효율성입니다. 멀티 코어 프로세서를 쉽게 사용할 수 있으므로 Java 개발자는 오류가 발생하기 쉬운 병렬 코드 처리를 작성해야 합니다.
이러한 문제를 해결하기 위해 Java 8은 개발자가 데이터를 선언적으로 처리하고 특정 코드를 작성할 필요 없이 멀티코어 아키텍처를 활용할 수 있도록 하는 스트림 개념을 도입했습니다.
Stream은 집계 작업을 지원하는 소스의 개체 시퀀스를 나타냅니다. 다음은 스트림의 특성입니다 -
요소 순서 - 스트림은 특정 유형의 요소 집합을 순차적으로 제공합니다. 스트림은 요청 시 요소를 가져오거나 계산합니다. 요소를 저장하지 않습니다.
출처 − 스트림은 컬렉션, 배열 또는 I/O 리소스를 입력 소스로 사용합니다.
집계 작업 − 스트림은 필터, 매핑, 제한, 축소, 찾기, 일치 등과 같은 집계 작업을 지원합니다.
파이프라인 - 대부분의 스트림 작업은 결과가 파이프라인될 수 있도록 스트림 자체를 반환합니다. 이러한 작업을 중간 작업이라고 하며 해당 기능은 입력을 받아 처리하고 대상에 출력을 반환하는 것입니다. collect() 메서드는 일반적으로 스트림의 끝을 표시하기 위해 파이프라이닝 작업의 끝에 존재하는 터미널 작업입니다.
자동 반복 − 스트림 작업은 명시적인 반복이 필요한 컬렉션과 달리 제공된 소스 요소에 대해 내부적으로 반복을 수행합니다.
Java 8에서는 Collection 인터페이스에 스트림을 생성하는 두 가지 방법이 있습니다.
스트림() − 컬렉션을 소스로 간주하여 순차 스트림을 반환합니다.
병렬스트림() − 컬렉션을 소스로 간주하는 병렬 스트림을 반환합니다.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
스트림은 스트림의 각 요소를 반복하기 위해 새로운 메소드 'forEach'를 제공했습니다. 다음 코드 부분은 forEach를 사용하여 10개의 난수를 인쇄하는 방법을 보여줍니다.
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
'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' 방법은 스트림의 크기를 줄이는 데 사용됩니다. 다음 코드 부분은 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 프로그램을 만듭니다.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
public final class Optional<T> extends Object
시니어 번호 | 방법 및 설명 |
---|---|
1 |
정적 빈 Optional 인스턴스를 반환합니다. |
2 | 부울 등호(객체 obj) 일부 다른 개체가 이 선택 항목과 "동일한"지 여부를 나타냅니다. |
3 |
선택적 값이 있고 값이 주어진 술어와 일치하면 값을 설명하는 Optional을 반환하고 그렇지 않으면 빈 Optional을 반환합니다. |
4 | 선택사항 flatMap(Function super T,Optional> 매퍼) 값이 있으면 제공된 Optional 베어링 매핑 기능을 적용하고 해당 결과를 반환하고 그렇지 않으면 빈 Optional을 반환합니다. |
5 | 얻기() 이 Optional에 값이 있으면 값을 반환하고, 그렇지 않으면 NoSuchElementException을 발생시킵니다. |
6 | int hashCode() 현재 값의 해시 코드 값(있는 경우) 또는 값이 없는 경우 0(영)을 반환합니다. |
7 | void ifPresent(소비자 슈퍼 T> 소비자) 값이 있으면 값으로 지정된 소비자를 호출하고, 그렇지 않으면 아무 작업도 수행하지 않습니다. |
8 | 부울 isPresent() 값이 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다. |
9 | 선택적 map(Function super T,? extends U> mapper) 값이 있으면 제공된 매핑 함수를 적용하고 결과가 null이 아니면 결과를 설명하는 Optional을 반환합니다. |
10 |
정적 현재 null이 아닌 값이 지정된 Optional을 반환합니다. |
11 |
정적 null이 아닌 경우 지정된 값을 설명하는 Optional을 반환하고, 그렇지 않으면 빈 Optional을 반환합니다. |
12 | 또는 기타(기타) 값이 있으면 반환하고 그렇지 않으면 다른 값을 반환합니다. |
13 | T orElseGet(Supplier extends T> other) 존재하는 경우 값을 반환하고, 그렇지 않으면 other를 호출하고 해당 호출의 결과를 반환합니다. |
14 |
포함된 값이 있으면 반환하고, 그렇지 않으면 제공된 공급자가 생성할 예외를 throw합니다. |
15 | 문자열 toString() 디버깅에 적합한 이 Optional의 비어 있지 않은 문자열 표현을 반환합니다. |
이 클래스는 다음 클래스에서 메소드를 상속합니다 -
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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에 도입된 동적 호출 기능을 사용합니다.
Nashorn 엔진의 경우 JAVA 8에는 새로운 명령줄 도구인 jjs,가 도입되었습니다. 콘솔에서 자바스크립트 코드를 실행합니다.
sample.js 파일 생성 및 저장 c:\> JAVA 폴더에 있습니다.
print('Hello World!');
콘솔을 열고 다음 명령을 사용하십시오.
C:\JAVA>jjs sample.js
다음과 같은 출력이 생성됩니다.
Hello World!
콘솔을 열고 다음 명령을 사용하십시오.
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를 사용하면 Java에서 JavaScript 코드를 호출하고 해석할 수 있습니다.
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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
다음 예제에서는 자바 스크립트에서 자바 클래스를 가져오고 사용하는 방법을 설명합니다.
sample.js 생성 및 저장 c:\> JAVA 폴더에 있습니다.
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가 도입되었습니다.
스레드로부터 안전하지 않음 − java.util.Date는 스레드로부터 안전하지 않으므로 개발자는 날짜를 사용하는 동안 동시성 문제를 처리해야 합니다. 새로운 날짜-시간 API는 변경할 수 없으며 setter 메서드가 없습니다.
불량한 디자인 − 기본 날짜는 1900년부터 시작하고, 월은 1부터 시작하고, 일은 0부터 시작하므로 균일성이 없습니다. 이전 API에는 날짜 작업에 대한 직접적인 방법이 적었습니다. 새로운 API는 이러한 작업을 위한 다양한 유틸리티 메서드를 제공합니다.
어려운 시간대 처리 − 개발자는 시간대 문제를 처리하기 위해 많은 코드를 작성해야 했습니다. 새로운 API는 도메인별 디자인을 염두에 두고 개발되었습니다.
Java 8은 java.time 패키지 아래에 새로운 날짜-시간 API를 도입했습니다. 다음은 java.time 패키지에 도입된 몇 가지 중요한 클래스입니다.
로컬 − 복잡한 시간대 처리가 없는 간소화된 날짜-시간 API.
존 − 다양한 시간대를 처리하는 특수 날짜-시간 API.
LocalDate/LocalTime 및 LocalDateTime 클래스는 시간대가 필요하지 않은 개발을 단순화합니다. 그들의 행동을 보자.
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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를 사용합니다. 그들의 행동을 살펴봅시다.
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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
java.time.temporal.ChronoUnit enum은 이전 API에서 일, 월 등을 나타내는 정수 값을 대체하기 위해 Java 8에 추가되었습니다. 작동 방식을 살펴보겠습니다.
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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에서는 시차를 처리하기 위해 두 개의 특수 클래스가 도입되었습니다.
기간 − 날짜 기반 시간을 다룹니다.
기간 − 시간 기반 시간을 다룹니다.
그들의 행동을 살펴봅시다.
예를 들어 C:\> JAVA.
에서 원하는 편집기를 사용하여 다음 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 프로그램을 만듭니다.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 프로그램을 만듭니다.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 인코딩을 사용할 수 있습니다.
간단함 − 출력은 A-Za-z0-9+/에 있는 문자 집합에 매핑됩니다. 인코더는 출력에 줄 바꿈을 추가하지 않으며 디코더는 A-Za-z0-9+/ 이외의 문자를 거부합니다.
URL − 출력은 A-Za-z0-9+_에 있는 문자 집합에 매핑됩니다. 출력은 URL 및 파일 이름에 안전합니다.
MIME − 출력은 MIME 친화적인 형식으로 매핑됩니다. 출력은 각각 76자 이하의 줄로 표시되며 줄 구분 기호로 캐리지 리턴 '\r' 다음에 줄 바꿈 '\n'을 사용합니다. 인코딩된 출력의 끝에 줄 구분자가 없습니다.
시니어 번호 | 중첩 클래스 및 설명 |
---|---|
1 | static class Base64.Decoder This class implements a decoder for decoding byte data using the Base64 encoding scheme as specified in RFC 4648 and RFC 2045. |
2 | static class Base64.Encoder This class implements an encoder for encoding byte data using the Base64 encoding scheme as specified in RFC 4648 and RFC 2045. |
Sr.No. | Method Name &Description |
---|---|
1 | static Base64.Decoder getDecoder() Returns a Base64.Decoder that decodes using the Basic type base64 encoding scheme. |
2 | static Base64.Encoder getEncoder() Returns a Base64.Encoder that encodes using the Basic type base64 encoding scheme. |
3 | static Base64.Decoder getMimeDecoder() Returns a Base64.Decoder that decodes using the MIME type base64 decoding scheme. |
4 | static Base64.Encoder getMimeEncoder() Returns a Base64.Encoder that encodes using the MIME type base64 encoding scheme. |
5 | static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator) Returns a Base64.Encoder that encodes using the MIME type base64 encoding scheme with specified line length and line separators. |
6 | static Base64.Decoder getUrlDecoder() Returns a Base64.Decoder that decodes using the URL and Filename safe type base64 encoding scheme. |
7 | static Base64.Encoder getUrlEncoder() Returns a Base64.Encoder that encodes using the URL and Filename safe type base64 encoding scheme. |
This class inherits methods from the following class −
Create the following Java program using any editor of your choice in say C:/> 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()); } } }
Compile the class using javac compiler as follows −
C:\JAVA>javac Java8Tester.java
Now run the Java8Tester as follows −
C:\JAVA>java Java8Tester
It should produce the following output −
Base64 Encoded String (Basic) :VHV0b3JpYWxzUG9pbnQ/amF2YTg= Original String: TutorialsPoint?java8 Base64 Encoded String (URL) :VHV0b3JpYWxzUG9pbnQ_amF2YTg= Base64 Encoded String (MIME) :YmU3NWY2ODktNGM5YS00ODlmLWI2MTUtZTVkOTk2YzQ1Njk1Y2EwZTg2OTEtMmRiZC00YTQ1LWJl NTctMTI1MWUwMTk0ZWQyNDE0NDAwYjgtYTYxOS00NDY5LTllYTctNjc1YzE3YWJhZTk1MTQ2MDQz NDItOTAyOC00ZWI0LThlOTYtZWU5YzcwNWQyYzVhMTQxMWRjYTMtY2MwNi00MzU0LTg0MTgtNGQ1 MDkwYjdiMzg2ZTY0OWU5MmUtZmNkYS00YWEwLTg0MjQtYThiOTQxNDQ2YzhhNTVhYWExZjItNjU2 Mi00YmM4LTk2ZGYtMDE4YmY5ZDZhMjkwMzM3MWUzNDMtMmQ3MS00MDczLWI0Y2UtMTQxODE0MGU5 YjdmYTVlODUxYzItN2NmOS00N2UyLWIyODQtMThlMWVkYTY4M2Q1YjE3YTMyYmItZjllMS00MTFk LWJiM2UtM2JhYzUxYzI5OWI4
java
알루미늄 CNC 프로토타이핑은 상당한 이점을 제공할 수 있습니다. 더 쉬운 재료에서 한 단계 더 나아가서는 더 다양한 산업 분야에서 새로운 응용 분야를 개척할 수 있습니다. CNC 머시닝에서 가장 일반적인 재료 중 하나인 알루미늄은 프로토타입 제작에 이상적인 재료이며 사내에 기능을 도입하는 것은 확실히 고려할 가치가 있습니다. 귀하의 작업이 담당하는 산업과 필요한 부품에 따라 필수품이 될 수도 있습니다. 자세히 살펴보면 알루미늄에 대해 배울 정보가 엄청나게 많습니다. CNC 알루미늄 프로토타이핑이 귀하에게 의미하는 바에 대한 쉽
CNC 툴 홀더는 공작 기계 스핀들과 커팅 비트 사이의 구성 요소입니다. 툴 홀더의 주요 기능은 커팅 비트를 가능한 한 정확하고 단단하게 고정하는 것입니다. 이는 최소한의 공구 흔들림과 가공 결과의 최대 정밀도를 보장합니다. 런아웃은 회전할 때 도구의 중심에서 벗어난 편향을 나타냅니다. 이 기사에서는 도구 홀더의 구조, 유형 및 가장 적합한 도구를 선택하는 방법을 배우게 됩니다. 건설 CNC 공구 홀더는 원뿔, 칼라(또는 플랜지) 및 콜릿 포켓의 세 가지 주요 부분으로 구성됩니다. 콘은 스핀들에 직접 연결되는 부분입니다. 칼라는