자바 프로 그래 밍 의 if-else 최적화 기술 총화
인터넷 에서 많은 사람들 이 전략 모델 을 사용 하여 if-else 를 최적화 하 는 것 을 추천 하 는 것 을 보 았 지만 저 는 항상 전략 류 를 만들어 대량의 if-else 를 최적화 시 키 는 것 이 좋 습 니 다.생각 은 좋 지만 본의 아니 게 여러 가지 대상 을 만 들 수 있어 서 너무 힘 들 어 보 입 니 다.만약 에 전략 모델 을 사용 하여 대량의 if-else 를 최적화 시 키 려 면 더 좋 은 방법 이 있 습 니 다.이것 은 전략 모델+매 거 방식 의 개량 입 니 다.저 는 예전 에 이런 최적화 글 을 쓴 적 이 있 습 니 다.상세 하 게 이 글 을 클릭 하여 알 아 보 겠 습 니 다'전략 매 거 진:프로젝트 에서 if-else 를 대량으로 사용 하 는 우아 한 자 세 를 제거 합 니 다'.
2.3 개의 연산 자 를 사용 하여 if-else 최적화
1.if-else 조건 에 따라 할당 을 판단 합 니 다.예 를 들 어:
String id="";
if(flag){
id="a";
}else{
id="b";
}
세 개의 연산 자 를 이용 하여 한 줄 코드 로 직접 최적화 할 수 있 습 니 다.
id=flag?"a":"b";
2.if-else 조건 을 이용 하여 호출 방법 을 판단 한다.예 를 들 어:
Set<String> set1=new HashSet<>();
Set<String> set2=new HashSet<>();
if(flag){
set1.add(id);
}else{
set2.add(id);
}
세 개의 연산 자 를 이용 하여 직접 최적화 할 수 있 습 니 다.
Set<String> set1=new HashSet<>();
Set<String> set2=new HashSet<>();
(flag?set1:set2).add(id);
3.사용 Stream 최적화 if 중 판단 조건 과 다 상황Jdk 1.8 새로운 기능 Stream 흐름 은 세 가지 API,anyMatch,allMatch,noneMatch 가 있 습 니 다.각자 의 역할 은 다음 과 같 습 니 다.
List<String> list = Arrays.asList("a", "b", "c","d", "");
// true
boolean anyMatch = list.stream().anyMatch( s->StringUtils.isEmpty(s));
// true
boolean allMatch = list.stream().allMatch( s->StringUtils.isEmpty(s));
// true
boolean noneMatch = list.stream().noneMatch( s->StringUtils.isEmpty(s));
이 를 통 해 알 수 있 듯 이 상기 세 가지 실현 방식 에 따라 어느 정도 에 if 에서 조건 이 너무 많은 상황 을 판단 할 수 있다.그러면 어떤 장면 에서 이 를 최적화 시 키 는 것 이 적당 합 니까?일상적인 실제 개발 에서 우 리 는 이렇게 많은 판단 조건 이 존재 하 는 코드 를 본 적 이 있 을 것 이다.
if(StringUtils.isEmpty(str1) || StringUtils.isEmpty(str2) ||
StringUtils.isEmpty(str3) || StringUtils.isEmpty(str4) ||
StringUtils.isEmpty(str5) || StringUtils.isEmpty(str6)
){
.....
}
이때 stream 흐름 을 사용 하여 최적화 한 코드 는 다음 과 같다 는 것 을 고려 할 수 있다.
if(Stream.of(str1, str2, str3, str4,str5,str6).anyMatch(s->StringUtils.isEmpty(s))){
.....
}
이렇게 최적화 하면 그 if 에 쌓 인 조건 보다 더 우아 하지 않 습 니까?물론 이것 은 조건 에 대한 것 일 뿐 이 고 조건 과 만 났 을 때 도 Stream 으로 최적화 할 수 있다.예 를 들 어:
if(StringUtils.isEmpty(str1) && StringUtils.isEmpty(str2) &&
StringUtils.isEmpty(str3) && StringUtils.isEmpty(str4) &&
StringUtils.isEmpty(str5) && StringUtils.isEmpty(str6)
){
.....
}
Stream 최적화 사용 후:
if(Stream.of(str1, str2, str3, str4,str5,str6).allMatch(s->StringUtils.isEmpty(s))){
.....
}
4.맵 을 사용 하여 if-else 최적화최 적 화 량 이 비교적 많은 프로 세 스 를 대상 으로 하 는 if-else 문 구 는 Map 을 사용 하여 최적화 하 는 것 도 고려 할 수 있다.비록 어느 정도 에 추가 맵 을 만 들 면 메모 리 를 차지 하지만 그 작은 메모 리 는 현 단계 컴퓨터 에 있어 서 언급 할 가치 가 없다 고 할 수 있다.다음은 하나의 사례 를 이용 하여 소개 하 겠 습 니 다.
일부 조상 대대로 전해 내 려 오 는 코드 중에서 이렇게 냄새 나 고 불필요 한 if-else 기법 을 만 났 을 수 있 습 니 다.
public String getDay(String day){
if("Monday".equals(day)){
return " ";
}else if("Tuesday".equals(day)){
return " ";
}else if("Wednesday".equals(day)){
return " ";
}else if("Thursday".equals(day)){
return " ";
}else if("Sunday".equals(day)){
return " ";
}else{
......
}
}
이때 구체 적 인 장면 에 따라 Map 을 이용 하여 최적화 할 수 있 는 지,Map 을 사용 하여 최적화 하 는 방식 을 고려 할 수 있 습 니 다.먼저 이 유형 에서 static 의 map 를 정의 하 는 것 입 니 다.이와 같 습 니 다.
public static final Map<String,String> dayMap= ImmutableMap.<String, String>builder()
.put("Monday"," ")
.put("Tuesday"," ")
.put("Wednesday"," ")
.put("Thursday"," ")
.put("Sunday"," ")
.build();
정의 가 끝 난 후에 이전에 if-else 를 사용 하 는 방법 에서 이렇게 최적화 합 니 다.
public String getDay(String day){
return dayMap.get(day);
}
이렇게 최적화 한 후에 업무 방법 에서 의 판단 획득 치 의 처 리 는 매우 상쾌 해 졌 다.물론 이것 은 양 이 비교적 많은 if-else 에 게 비교적 적은 판단 문 구 를 대상 으로 맵 을 추가 로 정의 하여 만 들 었 을 뿐 은근히 사족 을 그 렸 다 는 혐의 가 있다.세심 한 독자 들 은 제 가 맵 을 정의 할 때 ImmutableMap 을 사용 한 것 을 발견 할 수 있 습 니 다.이것 은 Google Guava 의 한 종류 입 니 다.가 변 적 이지 않 은 맵 대상 을 만 들 수 있 습 니 다.이것 은 정 의 를 초기 화 한 후에 나중에 put 를 수정 할 수 없다 는 것 을 의미 합 니 다.이 특성 은 스 레 드 의 안전 을 보장 할 수 있 습 니 다.일반적으로 if-else 의 맵 을 교체 하 는 데 사 용 됩 니 다.우 리 는 정 의 를 초기 화 한 후에 더 이상 수정 을 허용 하지 않 기 때문에 이 ImmutableMap 이 생 성 한 맵 은 이 점 을 잘 실현 할 수 있 습 니 다.또한 가장 중요 한 것 은 이 ImmutableMap 을 사용 하면 체인 프로 그래 밍 을 실현 할 수 있 습 니 다.위 에서 정 의 된 체인 쓰기 와 같이 전통 적 인 map 로 정의 하면 매번 map.put(),map.put()의 할당 을 해 야 합 니 다.
ImmutableMap 의 원리 에 대해 저 는 전문 적 으로 글 을 써 서 소개 합 니 다:《자바 소스 코드 분석:Guava 의 불가 변 집합 ImmutableMap 의 소스 코드 분석》
5.매 거 진 최적화 if-else 사용
앞에서 언급 한 바 와 같이 대량의 if-else 를 최적화 하기 위해 전략 매 거 진 을 사용 할 수 있 습 니 다.물론 서로 다른 조건 으로 값 을 얻 는 코드 만 판단 하면 매 거 진 을 직접 사용 하여 최적화 하 는 것 을 고려 할 수 있 습 니 다.그 효 과 는 map 의 처리 효과 와 유사 합 니 다.
아니면 앞에서 과정 을 판단 하 는 if-else 를 사례 로 최적화 할 것 인가?
우선,클래스 에서 매 거 진 것 을 정의 합 니 다.
public enum dayEnum {
Monday(" "),
Tuesday(" "),
Wednesday(" "),
Thursday(" "),
Sunday(" ");
public String value;
dayEnum(String value){
this.value=value;
}
}
정 의 를 마 친 후에 앞의 map 와 같은 방식 으로 판단 치 를 매 거 진 에서 얻 은 다음 에 얻 은 값 으로 돌아 갈 수 있 습 니 다.이렇게 쓰 는 것 도 우아 하지 않 습 니까?
public String getDay(String day){
return dayEnum.valueOf(day).value;
}
6.Optional 클래스 를 사용 하여 if-else 최적화실제 업무 에서 저 는 이런 코드 를 만난 적 이 있 습 니 다.문제 가 없 는 것 처럼 보이 지만 그 중의 한 속성 치가 불행 하 게 도 null 이 라면 축하합니다.NullPointer Exception 이상 을 제기 하 는 것 을 좋아 할 것 입 니 다.
String name=school.getGrades().getStuendt().getName();
이 가능 한 빈 포인터 이상,전통 적 인 표기 법 을 처리 하려 면 if-else 문 구 를 한 무더기 써 서 처리 할 수 있 습 니 다.이와 같 습 니 다.
String name=null;
if(school!=null){
Grades grade=school.getGrades();
if(grade!=null){
Student student=grade.getStuendt();
if(student!=null){
name = student.getName();
}
}
}
if-else 를 극도로 싫어 하 는 사람 으로서 어떻게 이 겹겹이 포 함 된 코드 가 존재 하 는 것 을 용인 할 수 있 습 니까?이러한 층 층 이 포 함 된 if-else 판단 을 만 났 을 때 jdk 1.8 새로운 특성 인 Optional 류 를 사용 하여 최적화 하 는 것 을 고려 할 수 있 습 니 다.최적화 후의 효 과 는 다음 과 같 고 갑자기 우아 해 졌 습 니 다.
String name = Optional.ofNullable(school)
.flatMap(School::getGrades)
.flatMap(Grades::getStuendt)
.map(Student::getName)
.orElse(null);
본 고 는 if-else 최적화 프로 그래 밍 기법 의 정리 에 속 하고 나중에 실천 에서 새로운 수확 이 있 으 면 지속 적 으로 업데이트 할 것 이다.자바 프로 그래 밍 기법 에 대한 if-else 의 최적화 정리 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 if-else 와 관련 된 최적화 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.