자바 8-4-stream api 와 함수 식 프로 그래 밍 간단 한 응용

지난 글 에서 우 리 는 자바 8 에 내 장 된 함수 식 인터페이스 의 특징 과 사용 방식 을 소개 하고 마지막 으로 stream api 의 지식 점 을 이 끌 어 냈 다.그 다음 에 우 리 는 자바 8 의 stream api 를 배우 기 시작 했다.먼저 간단 한 요 구 를 가정 하고 문자열 집합 이 존재 합 니 다.우 리 는 모든 길이 가 5 이상 인 문자열 을 콘 솔 에 대문자 로 출력 하고 싶 습 니 다.그 전에 우 리 는 직접 이렇게 할 수 있 습 니 다.
public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");

        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).length() > 5){
                System.out.println(list.get(i).toUpperCase());
            }
        }
    }
}

이제 stream api 로 바 꿔 서 보 세 요.
public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");
        list.stream().filter(s -> s.length() > 5).map(s -> s.toUpperCase()).forEach(System.out::println);
    }
}

1 줄 코드 가 직접 해결 되 고 이런 체인 프로 그래 밍 스타일 은 의미 적 으로 논리 가 뚜렷 하 다.stream 방법 은 먼저 이 집합 한 Stream 대상 을 구 축 했 습 니 다.filter 방법 은 길이 가 5 이상 인 문자열 을 꺼 내 고 map 방법 은 모든 문자열 을 대문자 로 바 꾸 고 foreach 는 콘 솔 에 출력 합 니 다.우 리 는 Stream 인터페이스의 소스 세 션 을 대조 하여 이 stream api 의 정 의 를 볼 수 있다.
public interface Stream extends BaseStream> {
    
    Stream filter(Predicate super T> predicate);
    
     Stream map(Function super T, ? extends R> mapper);
    
    void forEach(Consumer super T> action);
    .
    .  
    .
}

filter 방법 은 Predicate 함수 식 인터페이스 형식 을 매개 변수 로 받 고 Stream 대상 을 되 돌려 줍 니 다.이전 편 에서 우 리 는 하나의 매개 변 수 를 받 아 불 형식의 lambda 표현 식 으로 Predicate 함수 식 인터페이스 인 스 턴 스 를 만 들 수 있다 는 것 을 알 고 있 었 기 때문에 filter 가 받 은 매개 변 수 는 s->s.length()>5 입 니 다.
map 방법,Function 함수 식 인터페이스 형식 을 수신 하고 인 자 를 받 습 니 다.반환 값 s->s.toUpperCase()가 바로 이 일 을 했 습 니 다.
foreach 방법,Consumer 함수 식 인터페이스 형식 을 수신 하고 인 자 를 받 습 니 다.값 을 되 돌려 주지 않 습 니 다.여기 서 사용 하 는 방법 중 하 나 는 System.out:println 으로 Consumer 인 스 턴 스 를 만 들 었 습 니 다.
그래서 위의 예 를 통 해 함수 식 프로 그래 밍 과 stream api 가 매우 밀접 하 게 결합 되 어 있 음 을 알 수 있다.여러분 도 모든 방법 을 소개 할 때 우 리 는 중간 조작 과 중지 조작 이 있다 고 언급 했 습 니 다.중지 작업 은 우리 가 결 과 를 필요 로 한 다 는 것 을 의미 합 니 다.프로그램 이 종료 작업 을 만 났 을 때 진정 으로 실 행 될 수 있 습 니 다.중간 조작 이란 조작 을 중지 하기 전에 모든 방법 을 말한다.이런 방법 들 은 방법 체인 의 형식 으로 조직 하여 열 논 리 를 처리 하 는데 중간 조작 만 있 고 조작 을 중지 하지 않 으 면 프로그램 을 실행 하 더 라 도 코드 는 실행 되 지 않 는 다.
실제 맵 방법 에 서 는 다른 방법 으로 인용 하 는 형식 으로 처리 할 수 있 으 며,클래스 방법 으로 참조 할 수 있 습 니 다.방법 명
public class Test3 {
    public static void main(String[] args) {
        List list = Arrays.asList("hello","world","helloworld");
        list.stream().filter(s -> s.length() > 5).map(String::toUpperCase).forEach(System.out::println);
    }
}

앞서 소개 한 System.out:println 은 대상 에 속 하 는 방법 으로 인용 되 었 으 며,클래스 방법 으로 인용 하 는 응용 도 광범 위 하 다.다만 이해 하 는 데 시간 이 좀 걸 립 니 다.map 방법 은 Function 함수 식 인터페이스의 실현 을 받 아들 여야 합 니 다.그러면 입력 이 필요 하고 출력 이 있어 야 합 니 다.그러나 toUpperCase 방법의 정 의 를 살 펴 보 겠 습 니 다.
public String toUpperCase() {
    return toUpperCase(Locale.getDefault());
}

반환 값 이 있 지만 인삼 이 들 어가 지 않 았 습 니 다.얼핏 봐 도 Function 인터페이스 에서 apply 방법의 정의 에 부합 되 지 않 습 니 다.이것 도 같은 방법 으로 인용 한 특징 입 니 다.toUpperCase 에 명확 한 참여 가 없 지만 이때 toUpperCase 의 입력 은 그 대상 을 호출 하 는 것 이기 때문에 컴 파일 러 는 toUpperCase 방법 을 호출 하 는 그 대상 을 매개 변수 로 합 니 다.즉,lambda 표현 식 s->s.toUpperCase()의 s 매개 변수 입 니 다.그래서 하나의 입력 과 출력의 정 의 를 만족시킨다.
소결:이 편 은 함수 식 프로 그래 밍 과 stream api 응용 및 클래스 방법 참조 의 사용 을 간단하게 소개 합 니 다.lambda 표현 식 은 오래된 버 전의 코드 를 더욱 간결 하 게 하고 방법 참조 로 lambda 표현 식 을 더욱 간결 하 게 합 니 다.사실은 lambda 표현 식 의 문법 사탕 입 니 다.
다음 편

좋은 웹페이지 즐겨찾기