当前位置: 首页 > 知识库问答 >
问题:

对lambda表达式感到困惑

乜钱明
2023-03-14

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

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
                 );

>

  • 要为图形添加框架,我认为"

    “我真的不明白?颜色。白:c”。第一,为什么它们在前一个括号之外?其次,问号(?)意思是?

    提前感谢您的帮助。

  • 共有2个答案

    桑思远
    2023-03-14

    你的程序相当于这样:(如果你不使用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;
    }
    
    黎同
    2023-03-14

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

    从第二部分开始:A B : C表示“如果认为A为真,则我的值为B,否则为C。表达式中的一种< code>if语句。

    至于第一部分:如果任何一个单独的测试都是真的(每个测试的形式都是点太左/右/上/下),那么该点(大概)在外面,并且是白色的;否则,请使用颜色 C。你不能让它们同时都为真:例如,一个点不能太左太右太右。

     类似资料:
    • 问题内容: 我对正则表达式中的反斜杠感到困惑。在正则表达式中,a具有特殊含义,例如表示十进制数字。如果在反斜杠前面添加反斜杠,则该特殊含义会丢失。在正则表达式中,可以阅读: 也许最重要的元字符是反斜杠。与Python字符串文字一样,反斜杠后可以跟各种字符,以表示各种特殊序列。它也用于转义所有元字符,因此您仍可以按模式匹配它们。例如,如果您需要匹配或,则可以在它们前面加上反斜杠以删除其特殊含义:或。

    • 我正在尝试提出一种解决方案,它涉及在连接操作之后应用一些逻辑,从多个中的中选择一个事件。这类似于reduce函数,但它只返回1个元素,而不是递增地返回。因此最终结果将是单个(,对,而不是一个 每个键保证只到达一次。 假设像上面这样的连接操作,它用4个生成了1个,成功地连接并收集在。现在,我想做的是,立即访问这些值,并执行一些逻辑以将正确匹配到一个。例如,对于上面的数据集,我需要(,和)。 将为每个

    • 所以我一直在读Kafka的语义学,我对它的工作原理有点困惑。 我理解生产者如何避免发送重复的消息(以防代理的ack失败),但我不明白的是,在消费者处理消息但在提交偏移量之前崩溃的情况下,一次是如何工作的。Kafka不会在这种情况下重试吗?

    • 问题内容: 我已经在eclipse中创建了一个项目,并添加了Maven依赖项。在Eclipse中,它表示我正在使用JRE 1.5。一切在Eclipse中都可以正常运行,例如,我可以运行测试。 当我尝试从终端运行时,出现以下错误。 …在-source 1.3中不支持泛型(使用-source 5或更高版本来启用泛型)… 看来,Maven认为我正在使用JRE 1.3,并且无法识别泛型或for-each循

    • 问题内容: 在碰到此链接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using- executors-and-threadpoolexecutor 之后,这是我第一次为新项目使用Java线程池。 .html ,我对此更加困惑,这是页面中的代码, 在代码中,创建了一个固定大小的池并创建了10个工作线程,对吗? 线程池应该

    • 所以,是的,我保留了访客模式的主要思想,而不是来回的疯狂。这样可以吗?