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

时间:2017-12-24 22:16:05

标签: java java-8 functional-programming

由于我编写的代码的无副作用性质及其在并发代码中的实用性,我一直在尝试将更多函数式编程合并到我所做的事情中。我发现需要过滤掉java流的连续元素,并且无法提供比普通旧命令方法更好的功能方法。假设我有一个记录其参数的程序,我想过滤掉2个连续的元素。例如,.wrap { width: 100%; overflow: auo; // should be auto } 。我在日志中想要的是-o anOption, -k aSecretKeyWhoseValueWeShouldNotLog, -a anotherOption

我提出了几种方法,但是没有一种方法可以理解为使用索引过去我需要过滤掉的东西的for循环。

这似乎是一件相当普遍的事情。是否有使用java流或其他任何东西的模式,这种模式通常用于此类事情?

谢谢,

这是我最终的结果。

-o anOption, -a anotherOption

1 个答案:

答案 0 :(得分: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]