如何跳过java流中的连续元素?

Sha*_*dre 3 java functional-programming java-8

我一直在努力将更多的函数式编程融入到我的工作中,因为我编写的代码的无副作用性质及其在并发代码中的实用性.我想要过滤掉java流的连续元素,并且无法提供比普通的旧命令方法更好的功能方法.假设我有一个记录其参数的程序,我想过滤掉2个连续的元素.例如,-o anOption, -k aSecretKeyWhoseValueWeShouldNotLog, -a anotherOption.我在日志中想要的是-o anOption, -a anotherOption.

我想出了几种方法,但是没有一种方法像使用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]);
}
Run Code Online (Sandbox Code Playgroud)

apo*_*his 5

我不确定这是否比你现有的更好.鉴于输入是a 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)));
}
Run Code Online (Sandbox Code Playgroud)

[-o,opt1,-a,opt2]

  • 啊.我有相同的东西,虽然你使用抽象地图,我使用了一对.我错过的是第二个过滤器后面的flatMap.非常感谢. (3认同)