我正在阅读一个示例代码,通过使用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
);
要为图形添加框架,我认为“&amp;&amp;”应该比“||”更合理。但是,“&amp;&amp;”在这里不起作用!有人可以解释一下吗?
我真的不明白“?Color.WHITE:c”。首先,为什么它们超出前一个括号?其次,问号(?)是什么意思?
提前感谢您的帮助。
答案 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;
}