对lambda表达感到困惑

时间:2015-05-24 16:20:31

标签: java

我正在阅读一个示例代码,通过使用lambda表达式调用它来添加一个10像素宽的灰色框架替换图像边框上的像素:

public static Image transform(Image in, ColorTransformer t) {
    int width = (int) in.getWidth();
    int height = (int) in.getHeight();
    WritableImage out = new WritableImage(width, height);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            out.getPixelWriter().setColor(x, y,
                    t.apply(x, y, in.getPixelReader().getColor(x, y)));
        }
    }
    return out;
}

@Override
public void start(Stage stage) throws Exception {
    Image image = new Image("test_a.png");
    Image newImage = transform(
                       image,
                       (x, y, c) -> (x <= 10 || x >= image.getWidth() - 10 || 
                                     y <= 10 || y >= image.getHeight() - 10) 
                                     ? Color.WHITE : c
                     );
        stage.setScene(new Scene(new VBox(
     new ImageView(image),
     new ImageView(newImage))));
  stage.show();
    stage.show();
 }
}

@FunctionalInterface
interface ColorTransformer {
    Color apply(int x, int y, Color colorAtXY);
}

我对lambda表达式感到困惑:

Image newImage = transform(
                   image,
                   (x, y, c) -> (x <= 10 || x >= image.getWidth() - 10 || 
                                 y <= 10 || y >= image.getHeight() - 10) 
                                 ? Color.WHITE : c
                 );
  1. 要为图形添加框架,我认为“&amp;&amp;”应该比“||”更合理。但是,“&amp;&amp;”在这里不起作用!有人可以解释一下吗?

  2. 我真的不明白“?Color.WHITE:c”。首先,为什么它们超出前一个括号?其次,问号(?)是什么意思?

  3. 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

首先,您的问题与lambda无关,而是一般的表达式。

从第二部分开始: A ? B : C 表示&#34;如果< em> A 被认为是真的,我的值是 B ,否则它是 C 。表达式中的一种if语句。

至于第一部分:如果个别测试中的任何为真(每个形式该点太远/左/上/下),然后该点(大概)在外面,并且是白色的;否则,请使用颜色c。你不可能同时拥有它们:例如,一个点不能太左和太远。

答案 1 :(得分:0)

你的程序相当于:(如果你不使用lambda)

public static Image transform(Image in) {
    int width = (int) in.getWidth();
    int height = (int) in.getHeight();
    WritableImage out = new WritableImage(width, height);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            Color c = in.getPixelReader().getColor(x, y);
            if (x <= 10 || x >= image.getWidth() - 10 || 
                y <= 10 || y >= image.getHeight() - 10) 
                c = Color.WHITE;
          /* else
                c = c; */
             out.getPixelWriter().setColor(x, y, c);
         }
    }
    return out;
}