2015-05-24 3 views
0

Я чтение пример кода, который должен добавить 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); 
} 

Я путать о лямбда-выражение:

Image newImage = transform(
        image, 
        (x, y, c) -> (x <= 10 || x >= image.getWidth() - 10 || 
           y <= 10 || y >= image.getHeight() - 10) 
           ? Color.WHITE : c 
       ); 
  1. чтобы добавить рамку к фигуре, я думаю, «& &» должен быть более разумным, чем «||». Но «& &« здесь не работает! Может ли кто-нибудь объяснить это?

  2. Я действительно не понимаю. «Цвет.WHITE: c». Во-первых, почему они находятся за пределами предыдущего скобки? Во-вторых, что означает знак вопроса (?)?

Благодарим за помощь.

+3

Ваш вопрос/проблема не связана с лямбда, но с логикой [условный оператор] (http://stackoverflow.com/а/17470669/1393766). – Pshemo

+0

Спасибо ~ Я чему-то научился. :-) – SuperDelta

ответ

1

Во-первых, ваш вопрос не имеет отношения к lambda, но выражения в целом.

Начиная со второй частью: ?B:C означает «если считается истинным, мое значение B в противном случае это C Разновидность if заявления внутри. выражения

Что касается первой части: если любой из отдельных испытаний является истинным (каждый из них имеет форму точка слишком левая/правая/вверх/вниз), то точка (предположительно) снаружи и окрашена в белый цвет; в противном случае используйте цвет c. Вы не можете, чтобы все они были истинными сразу: точка не может быть слишком длинной слева и слишком далеко правее, например.

+0

Большое вам спасибо за ваш комментарий. Я это понимаю. Только один вопрос: код вообще не определяет «c», поэтому, если условие FALSE, как система получит значение «c»? – SuperDelta

+0

Это * вопрос * о лямбда; '(x, y, c)' - это список параметров вашего 'lambda', поэтому' c', 'x' и' y' получают свои значения от вызова этой анонимной функции. –

0

Ваша программа эквивалентно следующему: (если вы не используете лямбда)

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; 
} 
Смежные вопросы