prominent java 8 features with code examples
예제와 함께 Java 8 릴리스에 도입 된 모든 주요 기능에 대한 포괄적 인 목록 및 설명 :
Oracle의 Java 8 릴리스는 세계 최고의 개발 플랫폼의 혁신적인 릴리스였습니다. 여기에는 조정 된 방식으로 JVM, Java 언어 및 라이브러리의 진화와 함께 전체적으로 Java 프로그래밍 모델에 대한 대규모 업그레이드가 포함되었습니다.
이 릴리스에는 사용 용이성, 생산성, 개선 된 다중 언어 프로그래밍, 보안 및 전반적으로 향상된 성능을위한 여러 기능이 포함되었습니다.
학습 내용 :
Java 8 릴리스에 추가 된 기능
주요 변경 사항 중 다음은 이번 릴리스에 추가 된 주목할만한 기능입니다.
- 기능적 인터페이스 및 람다 식
- Iterable 인터페이스의 forEach () 메서드
- 선택 수업,
- 인터페이스의 기본 및 정적 메서드
- 메서드 참조
- 컬렉션에 대한 대량 데이터 작업을위한 Java Stream API
- 자바 날짜 시간 API
- 컬렉션 API 개선
- 동시성 API 개선
- Java IO 개선
- Rhinoceros JavaScript 엔진
- Base64 인코딩 디코딩
- 기타 Core API 개선
이 자습서에서는 이러한 각 기능에 대해 간략하게 설명하고 간단하고 쉬운 예제를 통해 각 기능을 설명하려고합니다.
기능적 인터페이스 및 Lambda 표현식
Java 8에는 일반적으로 컴파일러 수준 오류에 사용되는 @FunctionalInterface라는 주석이 도입되었습니다. 일반적으로 사용중인 인터페이스가 기능 인터페이스 계약을 위반할 때 사용됩니다.
또는 기능 인터페이스를 SAM 인터페이스 또는 단일 추상 메소드 인터페이스로 호출 할 수 있습니다. 기능적 인터페이스는 구성원으로 정확히 하나의 '추상 메서드'를 허용합니다.
다음은 기능 인터페이스의 예입니다.
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); }
주석, @FunctionalInterface를 생략 할 수 있으며 기능 인터페이스는 여전히 유효한 것입니다. 이 주석은 인터페이스에 단일 추상 메서드가 있음을 컴파일러에 알리기 위해서만 사용됩니다.
노트 : 정의에 따라 기본 메서드는 비 추상적이며 원하는만큼 기능 인터페이스에 기본 메서드를 추가 할 수 있습니다.
둘째, 인터페이스에 'java.lang.object'의 공용 메서드 중 하나를 재정의하는 추상 메서드가있는 경우 인터페이스의 추상 메서드로 간주되지 않습니다.
다음은 유효한 기능 인터페이스 예입니다.
@FunctionalInterface public interface FunctionalInterface_one { public void firstInt_method(); @Override public String toString(); //Overridden from Object class @Override public boolean equals(Object obj); //Overridden from Object class }
Lambda 표현식 (또는 함수)은 익명 함수 (이름과 식별자가없는 함수)로 정의 할 수 있습니다. Lambda 표현식은 일반적으로 다른 함수에 대한 매개 변수로 필요한 위치에 정확하게 정의됩니다.
기술 지원 엔지니어 인터뷰 질문 및 답변
다른 관점에서 람다 식은 다음의 인스턴스를 표현합니다. 기능적 인터페이스 (전술 한 바와). Lambda 표현식은 기능 인터페이스에있는 유일한 추상 함수를 구현하므로 기능 인터페이스를 구현합니다.
Lambda 표현식의 기본 구문은 다음과 같습니다.
Lambda 표현식의 기본 예는 다음과 같습니다.
위의 표현식은 두 개의 매개 변수 x와 y를 취하고 그 합계 x + y를 반환합니다. x와 y의 데이터 유형을 기반으로이 방법은 다양한 장소에서 여러 번 사용할 수 있습니다. 따라서 매개 변수 x 및 y는 int 또는 Integer 및 string과 일치하고 컨텍스트에 따라 두 개의 정수를 추가하거나 (매개 변수가 int 인 경우) 두 문자열을 연결합니다 (매개 변수가 문자열 인 경우).
Lambda 표현식을 보여주는 프로그램을 구현해 보겠습니다.
interface MyInterface { void abstract_func(int x,int y); default void default_Fun() { System.out.println('This is default method'); } } class Main { public static void main(String args()) { //lambda expression MyInterface fobj = (int x, int y)->System.out.println(x+y); System.out.print('The result = '); fobj.abstract_func(5,5); fobj.default_Fun(); } }
산출:
위의 프로그램은 Lambda 표현식을 사용하여 파라미터에 추가하고 합계를 표시하는 방법을 보여줍니다. 그런 다음이를 사용하여 인터페이스 정의에서 선언 한 추상 메서드 'abstract_fun'을 구현합니다. 'abstract_fun'함수를 호출 한 결과는 함수를 호출하는 동안 매개 변수로 전달 된 두 정수의 합계입니다.
자습서 뒷부분에서 Lambda 식에 대해 자세히 알아 봅니다.
반복 가능한 인터페이스의 forEach () 메서드
Java 8은 컬렉션의 요소를 반복 할 수있는 인터페이스 java.lang.Iterable에 'forEach'메소드를 도입했습니다. 'forEach'는 Iterable 인터페이스에 정의 된 기본 메소드입니다. Iterable 인터페이스를 확장하여 요소를 반복하는 Collection 클래스에서 사용됩니다.
'forEach'메서드는 기능 인터페이스를 단일 매개 변수로 사용합니다. 즉, Lambda 표현식을 인수로 전달할 수 있습니다.
forEach () 메서드의 예.
importjava.util.ArrayList; importjava.util.List; public class Main { public static void main(String() args) { List subList = new ArrayList(); subList.add('Maths'); subList.add('English'); subList.add('French'); subList.add('Sanskrit'); subList.add('Abacus'); System.out.println('------------Subject List--------------'); subList.forEach(sub -> System.out.println(sub)); } }
산출:
그래서 우리는 주제, 즉 subList의 모음을 가지고 있습니다. Lambda Expression을 사용하여 각 요소를 인쇄하는 forEach 메서드를 사용하여 subList의 내용을 표시합니다.
선택 수업
Java 8은 'java.util'패키지에 선택적 클래스를 도입했습니다. '선택 사항'은 공용 최종 클래스이며 Java 응용 프로그램에서 NullPointerException을 처리하는 데 사용됩니다. 선택 사항을 사용하여 실행할 대체 코드 또는 값을 지정할 수 있습니다. Optional을 사용하면 nullPointerException을 피하기 위해 너무 많은 null 검사를 사용할 필요가 없습니다.
Optional 클래스를 사용하여 프로그램의 비정상적인 종료를 방지하고 프로그램 충돌을 방지 할 수 있습니다. Optional 클래스는 특정 변수에 대한 값의 존재를 확인하는 데 사용되는 메서드를 제공합니다.
다음 프로그램은 Optional 클래스의 사용을 보여줍니다.
import java.util.Optional; public class Main{ public static void main(String() args) { String() str = new String(10); OptionalcheckNull = Optional.ofNullable(str(5)); if (checkNull.isPresent()) { String word = str(5).toLowerCase(); System.out.print(str); } else System.out.println('string is null'); } }
산출:
이 프로그램에서는 Optional 클래스의 'ofNullable'속성을 사용하여 문자열이 null인지 확인합니다. 그럴 경우 적절한 메시지가 사용자에게 인쇄됩니다.
인터페이스의 기본 및 정적 메서드
Java 8에서는 추상이 아닌 인터페이스에 메소드를 추가 할 수 있습니다. 즉, 메소드 구현과 함께 인터페이스를 가질 수 있습니다. Default 및 Static 키워드를 사용하여 메서드 구현으로 인터페이스를 만들 수 있습니다. 기본 메서드는 주로 Lambda 식 기능을 활성화합니다.
기본 메소드를 사용하여 라이브러리의 인터페이스에 새로운 기능을 추가 할 수 있습니다. 이렇게하면 이전 버전 용으로 작성된 코드가 해당 인터페이스와 호환됩니다 (이진 호환성).
예를 들어 기본 방법을 이해하겠습니다.
import java.util.Optional; interface interface_default { default void default_method(){ System.out.println('I am default method of interface'); } } class derived_class implements interface_default{ } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); obj1.default_method(); } }
산출:
기본 구현이있는 default_method () 메소드가있는 'interface_default'라는 인터페이스가 있습니다. 다음으로 인터페이스“interface_default”를 구현하는“derived_class”클래스를 정의합니다.
이 클래스에는 인터페이스 메서드를 구현하지 않았습니다. 그런 다음 main 함수에서 'derived_class'클래스의 객체를 만들고 클래스에서 정의하지 않고도 인터페이스의 'default_method'를 직접 호출합니다.
이것은 인터페이스에서 기본 및 정적 메서드를 사용하는 것입니다. 그러나 클래스가 기본 메서드를 사용자 지정하려는 경우 메서드를 재정 의하여 자체 구현을 제공 할 수 있습니다.
방법 참조
Java 8에 도입 된 메서드 참조 기능은 Lambda 표현식이 Functional Interface의 메서드를 호출하는 약식 표기법입니다. 따라서 Lambda 식을 사용하여 메서드를 참조 할 때마다 Lambda 식을 메서드 참조로 바꿀 수 있습니다.
메서드 참조의 예.
import java.util.Optional; interface interface_default { void display(); } class derived_class{ public void classMethod(){ System.out.println('Derived class Method'); } } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); interface_default ref = obj1::classMethod; ref.display(); } }
산출:
이 프로그램에는 'display ()'라는 추상 메소드가있는 'interface_default'인터페이스가 있습니다. 다음으로 메시지를 출력하는 공용 메소드 'classMethod'가있는 'derived_class'클래스가 있습니다.
주 함수에는 클래스에 대한 객체가 있고, 'classMethod'에서 obj1 (클래스 객체)까지 클래스 메서드를 참조하는 인터페이스에 대한 참조가 있습니다. 이제 추상 메소드 디스플레이가 인터페이스 참조에 의해 호출되면 classMethod의 내용이 표시됩니다.
컬렉션에 대한 대량 데이터 작업을위한 Java Stream API
Stream API는 Java 8에 도입 된 또 다른 주요 변경 사항입니다. Stream API는 개체 컬렉션을 처리하는 데 사용되며 다른 유형의 반복을 지원합니다. Stream은 원하는 결과를 생성하기 위해 다양한 메서드를 파이프 라인 할 수있는 일련의 개체 (요소)입니다.
Stream은 데이터 구조가 아니며 컬렉션, 배열 또는 기타 채널에서 입력을받습니다. Streams를 사용하여 다양한 중간 작업을 파이프 라인 할 수 있으며 터미널 작업은 결과를 반환합니다. 별도의 Java 자습서에서 스트림 API에 대해 자세히 설명합니다.
자바 날짜 시간 API
Java 8에는 java.time 패키지 아래에 새로운 날짜-시간 API가 도입되었습니다.
그중 가장 중요한 클래스는 다음과 같습니다.
- 현지: 복잡한 시간대 처리없이 단순화 된 날짜-시간 API.
- 존 : 다양한 시간대를 처리하기위한 특화된 날짜-시간 API.
날짜
날짜 클래스는 Java 8에서 더 이상 사용되지 않습니다.
다음은 새로 도입 된 클래스입니다.
- LocalDate 클래스 날짜를 정의합니다. 시간이나 시간대에 대한 표현이 없습니다.
- LocalTime 수업 시간을 정의합니다. 날짜 또는 시간대를 나타내지 않습니다.
- LocalDateTime 클래스 날짜-시간을 정의합니다. 시간대를 나타내지 않습니다.
날짜 기능과 함께 시간대 정보를 포함하려면 OffsetDate, OffsetTime 및 OffsetDateTime의 3 가지 클래스를 제공하는 Lambda를 사용할 수 있습니다. 여기서 시간대 오프셋은 'ZoneId'라는 다른 클래스를 사용하여 표시됩니다. 이 주제는이 Java 시리즈의 후반부에서 자세히 다룰 것입니다.
Rhinoceros JavaScript 엔진
Java 8은 기존 Rhino를 대체하는 Nashorn과 같은 훨씬 향상된 JavaScript 엔진을 도입했습니다. Nashorn은 메모리에서 코드를 직접 컴파일 한 다음 바이트 코드를 JVM에 전달하여 성능을 10 배 향상시킵니다.
Nashorn은 콘솔에서 JavaScript 코드를 실행하는 새로운 명령 줄 도구 인 jjs를 도입했습니다.
다음 코드가 포함 된 자바 스크립트 파일 'sample.js'를 만들어 보겠습니다.
print (‘Hello, World!!’);
콘솔에서 다음 명령을 제공하십시오.
C : Java jjs sample.js
산출: 안녕하세요, 세계 !!
또한 대화 형 모드에서 JavaScript 프로그램을 실행하고 프로그램에 인수를 제공 할 수도 있습니다.
Base64 인코딩 디코딩
Java 8에는 Base64 인코딩에 대한 인코딩 및 디코딩이 내장되어 있습니다. Base64 인코딩의 클래스는 java.util.Base64입니다.
이 클래스는 세 가지 Base64 인코딩 및 디코더를 제공합니다.
- 기본: 여기에서 출력은 A-Za-z0-9 + / 사이의 문자 집합에 매핑됩니다. 인코더에 의해 출력에 줄 바꿈이 추가되지 않으며 디코더는 위 문자 이외의 모든 문자를 거부합니다.
- URL : 여기서 출력은 URL이고 안전한 파일 이름은 A-Za-z0-9 + / 사이의 문자 집합에 매핑됩니다.
- 몸짓 광대극: 이 유형의 인코더에서 출력은 MIME 친화적 인 형식으로 매핑됩니다.
컬렉션 API 개선
Java 8은 Collection API에 다음과 같은 새로운 메소드를 추가했습니다.
- forEachRemaining (소비자 조치) : 이는 기본 메소드이며 반복 자용입니다. 모든 요소가 처리되거나 '작업'에서 예외가 발생할 때까지 나머지 요소 각각에 대해 '작업'을 수행합니다.
- 컬렉션 removeIf (Predicate filter)의 기본 방법 : 지정된 'filter'를 충족하는 컬렉션의 모든 요소를 제거합니다.
- Spliterator () : 컬렉션 메서드이며 순차 또는 병렬 방식으로 요소를 순회하는 데 사용할 수있는 spliterator 인스턴스를 반환합니다.
- 맵 컬렉션에는 replaceAll (), compute () 및 merge () 메서드가 있습니다.
- 키 충돌이있는 HashMap 클래스가 성능 향상을 위해 개선되었습니다.
동시성 API 변경 / 향상
다음은 Concurrent API의 중요한 개선 사항입니다.
- ConcurrentHashMap은 다음 메소드로 향상되었습니다.
- 계산 (),
- 각각 (),
- forEachEntry (),
- forEachKey (),
- forEachValue (),
- 가다 (),
- 감소 () 및
- 검색 ()
- 실행자를위한“newWorkStealingPool ()”메소드는 작업 도용 스레드 풀을 생성합니다. 사용 가능한 프로세서를 대상 병렬 처리 수준으로 사용합니다.
- 'completableFuture'메서드는 값과 상태를 설정하여 명시 적으로 완료 할 수있는 메서드입니다.
Java IO 개선
Java 8에서 수행 된 IO 개선 사항은 다음과 같습니다.
- Files.list (경로 디렉토리) : 이는 각 요소가 디렉토리의 항목 인 유쾌하게 채워진 스트림을 반환합니다.
- Files.lines (경로 경로) : 스트림에서 모든 행을 읽습니다.
- Files.find () : 주어진 시작 파일을 루트로하는 파일 트리에서 파일을 검색하고 경로로 채워진 스트림을 반환합니다.
- BufferedReader.lines () : BufferedReader에서 읽은 행으로 모든 요소가있는 스트림을 리턴합니다.
기타 핵심 API 개선 사항
다음과 같은 기타 API 개선 사항이 있습니다.
- ThreadLocal의 Initial (Supplier supplier)을 사용하여 인스턴스를 쉽게 생성 할 수있는 정적 메서드
- 'Comparator'인터페이스는 기본 및 정적 방법으로 확장되어 자연스러운 순서 역순 등을 수행합니다.
- Integer, Long 및 Double 래퍼 클래스에는 min (), max () 및 sum () 메서드가 있습니다.
- 부울 클래스는 logicalAnd (), logicalOr () 및 logicalXor () 메서드로 향상되었습니다.
- Math 클래스에는 몇 가지 유틸리티 메서드가 도입되었습니다.
- JDBC-ODBC 브리지가 제거되었습니다.
- PermGen 메모리 공간이 제거됩니다.
결론
이 자습서에서는 Java 8 릴리스에 추가 된 주요 기능에 대해 설명했습니다. Java 8은 Java의 주요 릴리스이므로이 릴리스의 일부로 수행 된 모든 기능과 향상된 기능을 아는 것이 중요합니다.
최신 Java 버전은 13이지만 Java 8 기능에 익숙해지는 것이 좋습니다. 이 자습서에서 설명하는 모든 기능은 여전히 최신 버전의 Java에 있으며이 시리즈의 뒷부분에서 개별 항목으로 설명합니다.
이 튜토리얼이 다양한 Java 8 기능에 대해 배우는 데 도움이 되었기를 바랍니다.