자바 함수 식 프로 그래 밍(8)optional

3654 단어 자바Optional
이 시 리 즈 는 Venkat Subramaniam 의
Functional Programming in Java
다음 글 은 계속 주시 하 시기 바 랍 니 다.
자바 번역 소
단일 요소 선택
직관 적 으로 하나의 요 소 를 선택 하 는 것 은 여러 개 를 선택 하 는 것 보다 훨씬 간단 할 것 이다.그러나 여기 도 문제 가 있다.우 리 는 먼저 일반적인 방법의 문제 가 무엇 인지 본 다음 에 어떻게 lambda 표현 식 으로 그것 을 해결 하 는 지 보 자.
우 리 는 먼저 특정한 자모 로 시작 하 는 요 소 를 찾 아 인쇄 하 는 방법 을 새로 만 들 었 다.

public static void pickName(
final List<String> names, final String startingLetter) {
String foundName = null;
for(String name : names) {
if(name.startsWith(startingLetter)) {
foundName = name;
break;
}
}

이 방법 은 마치 방금 지나 간 쓰레기차 처럼 냄새 가 고약 하 다.우 리 는 먼저 foundName 의 변 수 를 새로 만 든 다음 null 로 초기 화 합 니 다.이것 이 바로 악취 의 근원 입 니 다.비어 있 는 지 확인 해 야 합 니 다.그렇지 않 으 면 NullPointer Exception 이나 오류 응답 을 던 집 니 다.우 리 는 또한 외부 교체 기 를 사용 하여 목록 을 순환 시 켰 다.만약 에 원 하 는 요 소 를 찾 은 후에 이 순환 에서 벗 어 나 야 한다.이것 은 원래 의 악 취 를 가중 시 켰 다.기본 적 인 유형 편집,명령 식 스타일,가 변성,모두 살 아 났 다.순환 을 종료 한 후에 우 리 는 먼저 결 과 를 검사 한 후에 야 인쇄 를 할 수 있다.이 정도 미 션 에 이렇게 긴 코드 를 썼 다 니.
우 리 는 이 문 제 를 다시 분석 해 보 자.우 리 는 단지 첫 번 째 일치 하 는 요 소 를 선택 하고 이러한 요소 가 존재 하지 않 는 상황 을 안전하게 처리 할 수 있 기 를 바 랄 뿐이다.이 pickName 방법 을 lambda 표현 식 으로 다시 쓰 겠 습 니 다.

public static void pickName(
final List<String> names, final String startingLetter) {
final Optional<String> foundName =
names.stream()
.filter(name ->name.startsWith(startingLetter))
.findFirst();
System.out.println(String.format("A name starting with %s: %s",
startingLetter, foundName.orElse("No name found")));
}

JDK 의 강력 한 기능 들 은 이 코드 를 더욱 간결 하 게 만 들 었 다.우선 우 리 는 filter 방법 으로 모든 조건 을 만족 시 키 는 요 소 를 얻 은 다음 에 Stream 류 의 findFirst 방법 으로 집합 으로 돌아 가 는 첫 번 째 요 소 를 선택 했다.이 방법 은 optional 대상 을 되 돌려 줍 니 다.이것 이 바로 자바 에서 공식 적 으로 인증 한 null 변수의 탈취 제 입 니 다.
optional 류 는 매우 유용 하 니 결과 가 존재 하 는 지 아 닌 지 는 신경 쓰 지 마 세 요.그것 은 우리 로 하여 금 빈 지침 의 이상 한 고민 을 면 하 게 하고 결과 가 없 는 것 도 가능 한 결과 라 는 것 을 더욱 명확 하 게 가 리 켰 다.isPresent()방법 을 통 해 결과 가 존재 하 는 지 알 수 있 습 니 다.결과 값 을 얻 으 려 면 get()방법 을 사용 할 수 있 습 니 다.앞의 코드 와 같은 기본 값 을 설정 할 수 있 습 니 다.
우 리 는 이전에 사용 해 왔 던 friends 집합 으로 우리 의 이 pickName 방법 을 검증 합 니 다.

pickName(friends, "N");
pickName(friends, "Z");

이 코드 는 첫 번 째 일치 하 는 요 소 를 선택 하고 찾 지 못 하면 우호 적 인 알림 정 보 를 출력 합 니 다.

A name starting with N: Nate
A name starting with Z: No name found

findFirst()방법 과 optinal 류 의 결합 사용 은 우리 의 코드 양 을 줄 였 고 괜 찮 은 것 같 습 니 다.하지만 옵션 류 의 기능 은 이 뿐만 이 아니다.예 를 들 어 대상 이 존재 하지 않 을 때 기본 값 을 제공 할 수 있 는 것 을 제외 하고 결과 가 존재 하면 코드 나 lambda 표현 식 을 실행 할 수 있 습 니 다.이렇게:

foundName.ifPresent(name -> System.out.println("Hello " + name));

명령 식 의 첫 번 째 이름 에 맞 는 코드 를 선택 하 는 것 보다 흐 르 는 우아 한 함수 식 스타일 이 더 좋 습 니 다.그런데 이 호출 스 트림 버 전에 서 하 는 일이 너무 많은 거 아니에요?물론 아 닙 니 다.이런 방법 들 은 매우 스마트 합 니 다.필요 에 따라 일 할 수 있 습 니 다(뒤쪽 113 페이지 에 있 습 니 다).
Stream 의 타성 수치 에서 우 리 는 이 점 을 깊이 연구 할 것 이다.
하나의 요 소 를 선택 한 예 는 JDK 라 이브 러 리 의 더 강력 한 기능 을 보 여 주 었 습 니 다.다음은 lambda 표현 식 이 하나의 집합 에 따라 원 하 는 값 을 구 하 는 방법 을 살 펴 보 겠 습 니 다.
다음 글 은 계속 주시 하 시기 바 랍 니 다.
자바 번역 소
오리지널 글 을 전재 할 때 출처 를 밝 혀 주 십시오.
http://it.deepinmind.com

좋은 웹페이지 즐겨찾기