2017-12-24 7 views
3

필자가 작성한 코드의 부작용없는 특성과 동시 코드에서의 유용성 때문에 필자는 내가하는 일에 더 많은 기능적 프로그래밍을 통합하려고 노력해 왔습니다. 필자는 자바 스트림의 연속적인 요소를 걸러 낼 필요성을 느꼈고 평범한 낡은 명령형 접근 방식보다 기능적 접근법을 더 잘 이해할 수 없었다. 인수를 기록하는 프로그램이 있고 2 개의 연속 요소를 걸러 내고 싶습니다. 예 : -o anOption, -k aSecretKeyWhoseValueWeShouldNotLog, -a anotherOption. 로그에서 원하는 것은 -o anOption, -a anotherOption입니다.자바 스트림에서 연속적인 요소를 건너 뛰는 방법은 무엇입니까?

나는 몇 가지 접근법을 생각해 냈지만, 필터링 할 필요가있는 항목을 색인화하는 for 루프를 사용하는 것만큼이나 이해할 수있는 방법은 없었습니다.

이것은 상당히 일반적인 일처럼 보입니다. 자바 스트림이나 다른 것을 사용하는 패턴이 있나요? 이런 종류의 일에 일반적으로 사용됩니까?

감사합니다.

다음은 내가 마지막 사항입니다.

static String filterSecretKeyOutOfCommandLineLogString(final String[] args) { 
    return joinArgsToString(filterOptionAndValueOutOfCommandLineLogString(SECRET_KEY, args)); 
} 

private static String joinArgsToString(final String[] args) { 
    return Joiner.on(ARG_JOINER_DELIMITER).join(args); 
} 

private static String[] filterOptionAndValueOutOfCommandLineLogString(final Option option, final String[] args) { 
    final List<String> filteredList = new ArrayList<>(); 

    final int numArgs = args.length; 

    for (int i = 0; i < numArgs; ++i) { 
     if (Arguments.matchesOption(option, args[i])) { 
      ++i; 
     } else { 
      filteredList.add(args[i]); 
     } 
    } 

    return filteredList.toArray(new String[0]); 
} 
+1

설명을 더 잘 설명 할 수 있도록 긴급한 방법을 제공해주십시오. –

+0

"연속적인 요소 건너 뛰기"란 무엇을 의미합니까? – 4castle

+3

당신은 우리가 지켜야 할 긴급한 접근법을 보여줄 수 있습니까? 이는 스트림 기반 접근 방식의 출발점으로 사용될 수 있습니다 (그리고 스트림 기반 접근 방식이 실제로 어떤 이점도 얻을 수 있다면). – Makoto

답변

5

내가 갖고있는 것보다 좋을지 모르겠습니다. 입력이 String[]하고 원하는 (중간) 출력도 String[]입니다 자바 스트림에 대한 간단한 마음 번역 될 수 있음을 감안할 때

static String[] filterOptionAndValue(String option, String args[]) { 
    return IntStream.range(0, args.length) 
      .filter(i -> i % 2 == 0) 
      .mapToObj(i -> new AbstractMap.SimpleEntry<>(args[i], args[i + 1])) 
      .filter(e -> !option.equals(e.getKey())) 
      .flatMap(e -> Stream.of(e.getKey(), e.getValue())) 
      .toArray(String[]::new); 
} 

public static void main(String... env) { 

    String[] args = {"-o", "opt1", "-k", "secret", "-a", "opt2"}; 

    System.out.println(Arrays.toString(filterOptionAndValue("-k", args))); 
} 

[-o, OPT1, -a, OPT2]

+3

Ah. 저는 같은 선을 따라 뭔가를 가졌지 만, 당신이 초록지도를 사용했던 곳에서 저는 한 쌍을 사용했습니다. 제가 놓친 것은 두 번째 필터 다음의 flatMap입니다. 많은 감사합니다. – ShastasPadre

관련 문제