2014-11-27 2 views
1

안녕하세요 쿠키 폼 HttpURLConnection 개체를 가져 오는 다음 코드가 있습니다.코드를 람다 함수로 변환

  for (int i=1; (headerName = connection.getHeaderFieldKey(i))!=null; i++){ 
       if (headerName.equals("Set-Cookie")){ 
        String cookie = connection.getHeaderField(i); 
        cookie = cookie.substring(0, cookie.indexOf(";")); 
        String cookieName = cookie.substring(0, cookie.indexOf("=")); 
        String cookieNameFromConfig = TalismaConnector.config.getValue("api.authentication.cookiename"); 
        if (cookieName.equals(cookieNameFromConfig)){ 
         //the right cookie to get the content from. 
         jsessionID = cookie.substring(cookie.indexOf("=") + 1, cookie.length()); 
         OptJsessionID = Optional.ofNullable(jsessionID); 
         break; 
        } 
       } 
      } 

나는 자바 8.

어떤 생각을 사용하여 강력한 람다 함수로이 쓰기 하시겠습니까?

답변

1

까다로운 부분은 null 상태에서 중지됩니다. Stream은 임의의 정지를 지원하지 않습니다. Predicate. 이 문제를 해결할 수있는 유일한 방법은 일치하는 항목과 null을 모두 Stream으로 전달하고 findFirst을 사용하여 일치하거나 첫 번째로 null을 찾는 것입니다.

우리는 모든 중간 단계가 null 처리하지 않기 때문에

, 우리는 빈 경우 아무것도 할 것이다 OptionalStream보다는 자신을 일치하는 항목을 캡슐화 Optional에 다음 단계를 적용 할 수 있습니다.

String cookieNameFromConfig = TalismaConnector.config.getValue(
                "api.authentication.cookiename"); 
IntStream.iterate(1, i -> i+1) 
.filter(i -> { String k=connection.getHeaderFieldKey(i); 
       return k==null || k.equals("Set-Cookie"); }) 
.mapToObj(i -> Optional.ofNullable(connection.getHeaderField(i)) 
    .map(cookie ->cookie.substring(0, cookie.indexOf(";"))) 
    .filter(cookie->cookie.regionMatches(0,cookieNameFromConfig,0,cookie.indexOf("=")))) 
.findFirst().get().ifPresent(cookie -> { 
     //the right cookie to get the content from. 
     jsessionID = cookie.substring(cookie.indexOf("=") + 1, cookie.length()); 
     OptJsessionID = Optional.of(jsessionID); 
}); 
+0

@Vinay 요셉 : 그게 내가 두 번째 문장에서 설명 무엇을, 술어는'null' 헤더 필드 또는'은'findFirst' 찾을 수 있도록' "- 쿠키 설정"두 경기를 모두 받아들 어느 쪽이든 먼저 오는 쪽을 선택하십시오. 스트림은 모든 기존 헤더 필드를 처리했을 때만 스트림이 'null'값을 만날 것이기 때문에 'null'을 만나면 일치하는 것이 없음을 의미합니다. 'null '이 발견되면, 즉 일치하는 것이 발견되지 않으면'findFirst(). get()'은 빈'Optional'으로 평가되고'ifPresent' 메소드는 아무것도하지 않습니다. – Holger

+0

나는 return의 구문에 익숙하지 않았다. True || False –

+0

@Vinay Joseph : 오, 그게 λ 식 질문의 범위에서 벗어난 것입니다. 신경 쓰지 마; ''||''논리적 인 '또는''논리적 인''에 대한 중요한 점은 첫 번째 표현식이'true'로 평가되면 두 번째 표현식을 평가하지 않기 때문에'k'가'null' 인 경우 Java는'equals '그것에. – Holger