2013-01-14 3 views
1

Lists.transform 방법을 사용하고 있습니다. 여기에는 CustomObject 출력 문자열 입력이 있습니다. 문자열 입력에는 콜론이 하나 있어야합니다. 그런 다음이 콜론을 분리 한 다음 문자열의 두 부분에서 사용자 정의 객체를 만듭니다.Guava Lists.transform - 하나의 입력이 나쁜 경우 어떻게해야합니까?

그래서 입력이

a:b 
c:d 
e:f 

이며, 출력은 세 CustomObject이

내 코드가

return new ArrayList(Lists.transform(groups, new Function<String, CustomObject>() { 
     @Override 
     public CustomObject apply(String input) { 
      String[] split = input.split(":"); 
      String one = split[0]; 
      String two = split[1]; 
      return new CustomObject(one, two); 
     } 
    })); 

내 질문 같은 것이있다 a, bc, de, f가 포함되어있는 목록 내가 얻을 수 있다는 것입니다 보낸 사람이 사용자에게서 온 것입니다. 내가 나쁜 입력이있는 경우 입력리스트는 다음

a:b 
d 
e,f 
g:h 

이 포함 된 경우 내가 a:bg:h

을 포함하는 두 CustomObject을 원하는

그래서 목록의 항목을 건너 싶은 구아바이 가능 ?

만약 내가 그것을하고 있었 더라면 나는 for 루프에서 계속해서 오류를 기록 할 것입니다.

의사 코드로 예를 들어

for loop { 
    if no colon present 
     continue; 
    create CustomObject 
} 

감사

+2

나는 그냥 루프 이전을 사용할 수 있다고 생각합니다. – nhahtdh

답변

5

내 접근 방식은 더 많은 기능이 될 것입니다, 나는 FluentIterable을 사용하십시오 :

return FluentIterable.from(groups).transform(new Function<String, CustomObject>() { 
     @Override 
     public CustomObject apply(String input) { 
      String[] split = Iterables.toArray(
       Splitter.on(':').trimResults().omitEmptyStrings().split(input), 
       String.class); 
      if(split.length!=2) return null; // bad input data 
      String one = split[0]; 
      String two = split[1]; 
      return new CustomObject(one, two); 
     } 
    }).filter(notNull()).toImmutableList(); 
     // ^^ -- Predicates.*  

그리고 함수와 상수에 분배기를 모두 변환 할 것입니다.

+4

또는'Predicates.notNull()'을 직접적으로 사용하십시오. –

+0

@FrankPavageau nice, 나는 그것을 놓쳤습니다 .-) 지금 내 대답을 바꿨습니다. –

12

당신이 정말로 "고전적인"방법을 가고 싶어하지 않을 경우 변환하기 전에, 당신은 항상 Iterables.removeIf를 사용할 수 있습니다.

하지만 "좋은 이전 루프"방법이 아마도 당신에게 더 좋습니다. 구아바 개발자는 explain here 이러한 기능 숙어의 남용에 싫은 내색 :

구아바의 함수형 프로그래밍 숙어의 과도한 사용, 자세한 혼란, 읽을 수없는, 비효율적 인 코드로 이어질 수 있습니다. 이들은 구아바에서 가장 쉽게 (그리고 가장 일반적으로) 남용되는 부분이며, 코드를 "한 줄짜리"로 만들기 위해 터무니없는 길이로 갈 때, 구아바 팀은 울음을 터뜨립니다.

+2

+1. 실제로 더 기능적인 스타일은 Iterables.filter를 사용하여 입력을 위생 처리 한 다음 남은 것을 변형하는 것이지만, 나는 구아바를 남용하지 않는 것에 동의합니다. – soulcheck

2

당신은) (선택 사양을 반환하는 함수를 변경하고 Optional.presentInstances를 사용할 수 있습니다

return Optional.presentInstances(Iterables.transform(groups, new Function<String, Optional<CustomObject>>() { 
     @Override 
     public Optional<CustomObject> apply(String input) { 
      if (*/ bad input data */) { 
       return Optional.absent(); 
      } 
      // ... 
      return Optional.of(new CustomObject("", "")); 
     } 
    })); 
관련 문제