| 종류 | 구현 위치 | 사용할 수 있는 외부 클래스 변수 | 생성 방법 |
|---|---|---|---|
| 인스턴스 내부 클래스 | 외부 클래스 멤버 변수와 동일 | 외부 인스턴스 변수 / 외부 전역 변수 | 외부 클래스를 먼저 만든 후 내부 클래스 생성 |
| 정적 내부 클래스 | 외부 클래스 멤버 변수와 동일 | 외부 전역 변수 | 외부 클래스와 무관하게 생성 |
| 지역 내부 클래스 | 메서드 내부에 구현 | 외부 인스턴스 변수 / 외부 전역 변수 | 메서드를 호출할 때 생성 |
| 익명 내부 클래스 | 메서드 내부에 구현 / 변수에 대입하여 직접 구현 | 외부 인스턴스 변수 / 외부 전역 변수 | 메서드를 호출할 떄 생성되거나, 인터페이스 타입변수에 대입할 때 new 예약어를 사용하여 생성 |
순수 함수(pure function)를 구현하고 호출
매개 변수만을 사용하도록 만든 함수로 외부 자료에 부수적인 영향(side effect)가 발생하지 않도록 함
입력 받은 자료를 기반으로 수행되고 외부에 미치지 않으므로 병렬처리등에 가능 안정적인 확장성 있는 프로그래밍 방식
매개 변수 하나인 경우 괄호 생략가능 ( 두 개인경우는 괄호를 생략할 수 없음)
익명 함수와 매개 변수만으로 구현되믈 단 하나의 메서드만을 선언해야 함
( 두개이상의 메서드가 선언되면 어느 메서드의 호출인지 모호해 짐 )
@FunctionalInterface 애노테이션 사용
@FunctionalInterface
interface Math {
public int Calc(int first, int second);
}
public static void main(String[] args) {
Math plus = (num1,num2) -> first + second; // 람다식!
int n1 = 2;
int n2 = 3;
int sum = plus(n1,n2);
}
자료의 대상과 관계없이 동일한 연산을 수행할 수 있는 기능(자료의 추상화)
배열, 컬렉션에 동일한 연산이 수행되어 일관성 있는 처리 가능
한번 생성하고 사용한 스트림은 재사용할 수 없음
스트림 연산은 기존 자료를 변경하지 않음
중간 연산과 최종 연산으로 구분 됨
최종 연산이 수행되어야 모든 연산이 적용되는 지연 연산
중간 연산 - filter(), map()
조건에 맞는 요소를 추출( filter() ) 하거나 요소를 변환 함(map())
문자열의 길이가 5 이상인 요소만 출력 하기
/* 문자열의 길이가 5 이상인 요소만 출력 하기 */
strings.stream() // 스트림 생성
.filter( str -> str.length() >= 5) // 중간 연산
.forEach( str -> System.out.println(str)); // 최종 연산
/* 고객 클래스에서 고객 이름만 가져오기 */
customers.stream() // 스트림 생성
.map( customer -> customer.getName() ) // 중간 연산
.forEach( name -> System.out.println(name) ); // 최종 연산
/* 배열의 모든 요소으 합을 구하는 reduce() 연산 */
Arrays.stream(arr)
.reduce(0,( a, b ) -> a + b ) );