如何用lambda表达式替换命令模式?

sub*_*nid 7 java lambda functional-programming java-8

这是对另一个问题(重用循环多维数组的代码)的后续跟踪,其中我通过使用命令模式解决了我的特定问题.我的问题是,我有多个方法对二维数组的每个元素执行操作 - 因此有很多重复的代码.而不是像这样的许多方法......

void method() {
    for (int i = 0; i < foo.length; i++) {
        for (int j = 0; j < foo[i].length; j++) {
            // perform specific actions on foo[i][j];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

......我这样解决了:

interface Command {
    void execute(int i, int j);
}

void forEach(Command c) {
    for (int i = 0; i < foo.length; i++) {
        for (int j = 0; j < foo[i].length; j++) {
            c.execute(i, j);
        }
    }
}

void method() {
    forEach(new Command() {
        public void execute(int i, int j) {
            // perform specific actions on foo[i][j];
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我们在Java中使用lambda表达式,那么如何缩短它?这看起来一般怎么样?(抱歉我的英语不好)

aim*_*aim 8

这里是Java 8 lamdas的简单示例.如果更改位Command类,则它将如下所示:

    @FunctionalInterface
    interface Command {
        void execute(int value);
    }
Run Code Online (Sandbox Code Playgroud)

这里它将接受来自子数组的值.然后你可以这样写:

    int[][] array = ... // init array
    Command c = value -> {
         // do some stuff
    };
    Arrays.stream(array).forEach(i -> Arrays.stream(i).forEach(c::execute));
Run Code Online (Sandbox Code Playgroud)

  • 它只返回[Stream](http://lambdadoc.net/api/index.html?java/util/stream/Stream.html):)你可以[尝试](http://jdk8.java.net/download .html)你自己. (3认同)