자바 프로 그래 밍 의 if-else 최적화 기술 총화

7892 단어 Javaif-else
1.정책 매 거 진 을 사용 하여 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 가 있 습 니 다.각자 의 역할 은 다음 과 같 습 니 다.
  • anyMatch:판단 조건 중 임의의 만족 조건 이 있 으 면 true 로 돌아 갑 니 다.
  • allMatch:판단 조건 에서 모든 조건 이 만족 하면 true 로 돌아 갑 니 다.
  • noneMatch:판단 조건 에서 모든 조건 이 만족 하지 않 으 면 true 로 돌아 갑 니 다.
  • 그들의 사용 방식 은 사실 매우 간단 하 다.
    
    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 와 관련 된 최적화 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기