2017-12-24 20 views
3

私は、コードの副作用のない性質と、並行コードでのそのユーティリティのために、より機能的なプログラミングを私がしていることに取り入れようとしてきました。私は、Javaストリームの連続した要素を除外する必要性に遭遇し、平易な古い命令的アプローチよりも優れた機能的アプローチを思いつくことができませんでした。引数を記録するプログラムがあり、2つの連続した要素を除外したいとします。たとえば、-o anOption, -k aSecretKeyWhoseValueWeShouldNotLog, -a anotherOptionとなります。ログに欲しいものは-o anOption, -a anotherOptionです。Javaストリーム内の連続した要素をスキップする方法は?

私はいくつかのアプローチを考え出しましたが、フィルタリングする必要があったものを索引付けしたforループを使用するのと同じくらい理解できませんでした。

これは、やりたいことはかなり一般的なようです。このようなことによく使われる、Javaストリームやその他のものを使ってパターンがありますか?

ありがとう、

これは私が最後にしたものです。

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[]では、Javaストリームへの単純な心を持った翻訳が可能性があることを考えると

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。私は同じ行に沿って何かを持っていましたが、抽象的なマップを使用した場所ではペアを使用しました。私が見逃したのは、2番目のフィルタに続くflatMapでした。どうもありがとう。 – ShastasPadre

関連する問題