2016-06-08 12 views
16

Tôi đã có mã này nhưng IntelliJ nói với tôi để thay thế ẩn danh với lambda nhưng tôi không biết làm thế nào. bất cứ ai có thể giúp tôi với điều này? Đây là mã của tôi:làm thế nào để thay thế vô danh với lambda trong java

soundVolume.valueProperty().addListener(new ChangeListener<Number>() { 
    public void changed(ObservableValue<? extends Number> ov, 
        Number old_val, Number new_val) { 
     main.setSoundVolume(new_val.doubleValue()); 
     main.getMediaPlayer().setVolume(main.getSoundVolume()); 
    } 
}); 
+0

Bạn biết rằng đây chỉ là một gợi ý, phải không? – Kai

Trả lời

24

Nói chung, một cái gì đó như thế:

methodUsingYourClass(new YourClass() { 
    public void uniqueMethod(Type1 parameter1, Type2 parameter2) { 
     // body of function 
    } 
}); 

được thay thế bằng

methodUsingYourClass((Type1 parameter1, Type2 parameter2) -> { 
    // body of function 
}); 

Đối với mã cụ thể của bạn:

soundVolume.valueProperty().addListener(
     (ObservableValue<? extends Number> ov, 
       Number old_val, Number new_val) -> { 
    main.setSoundVolume(new_val.doubleValue()); 
    main.getMediaPlayer().setVolume(main.getSoundVolume()); 
}); 

Lưu ý việc thay thế một lớp ẩn danh bằng lambda chỉ có thể nếu lớp ẩn danh có một phương pháp. Nếu lớp ẩn danh có nhiều phương thức thì không thể thay thế được.

Từ oracle documentation:

Phần trước, Lớp học Anonymous, cho bạn thấy làm thế nào để thực hiện một lớp cơ sở mà không cho nó một cái tên. Mặc dù điều này thường ngắn gọn hơn một lớp được đặt tên, cho các lớp chỉ có một phương thức, thậm chí một lớp ẩn danh có vẻ hơi quá mức và cồng kềnh. Biểu thức Lambda cho phép bạn thể hiện các cá thể của các lớp đơn phương nhỏ gọn hơn.

+2

Bạn cũng có thể bỏ qua các khai báo kiểu và loại bỏ một số bản mẫu với một cái gì đó như '.addListener ((quan sát, oldValue, newValue) -> {...}); ' –

1

Nó không thực sự hữu ích với khả năng đọc nhưng ở đây.

Lưu ý rằng tham chiếu của main phải là kết thúc cuối cùng hoặc hiệu quả để tính năng này hoạt động.

soundVolume.valueProperty() 
      .addListener(
      (ObservableValue<? extends Number> ov, Number old_val, Number new_val) -> { 
       main.setSoundVolume(new_val.doubleValue()); 
       main.getMediaPlayer().setVolume(main.getSoundVolume()) 
      }); 
23

Tại sao không để IntelliJ hiển thị cho bạn? Đặt con trỏ vào khai báo và nhấn Alt + Enter (hoặc Option + Enter nếu trên máy Mac) để hiển thị cửa sổ bật lên ý định. Chọn "Thay thế bằng lambda" và xem mã đã chuyển đổi ...

+3

Bằng cách này; cùng một kỹ thuật áp dụng cho hầu hết các đề xuất, tôi thường cho phép IDE chuyển đổi mã cho tôi nếu tôi đồng ý với đề xuất ... –

0

để rõ ràng mã, bạn cũng có thể khai báo biến với lambda và chuyển biến đó vào phương thức AddListener. ví dụ

soundVolume.valueProperty().addListener(listener);

ChangeListener<Number> listener = (observable, oldValue, newValue) -> { ... };

Các vấn đề liên quan