Toán tử mũi tên, '->', làm gì trong Java?


170

Trong khi tìm kiếm một số mã tôi đã gặp người vận hành mũi tên, chính xác thì nó làm gì? Tôi nghĩ rằng Java không có toán tử mũi tên.

return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> {
        return Car.SEDAN == ((Car)arg0).getStyle();
});

Chi tiết : Java 6, Bộ sưu tập Commons Apache, IntelliJ 12

Cập nhật / Trả lời: Hóa ra IntelliJ 12 hỗ trợ Java 8, hỗ trợ lambdas và "gấp" Dự đoán và hiển thị chúng dưới dạng lambdas. Dưới đây là mã "không gấp".

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});

5
Lưu ý rằng kịch bản chính xác là IntelliJ hiển thị mã hiện có dưới dạng biểu thức lambda để dễ đọc hơn. Mã thực tế không phải là một biểu thức lambda.
Thorbjørn Ravn Andersen

Câu trả lời:


124

Đó là một phần cú pháp của các biểu thức lambda mới, sẽ được giới thiệu trong Java 8. Có một số hướng dẫn trực tuyến để hiểu rõ về nó, đây là một liên kết đến một. Về cơ bản, việc ->tách các tham số (bên trái) khỏi việc thực hiện (bên phải).

Cú pháp chung để sử dụng biểu thức lambda là

(Tham số) -> {Body} trong đó '->' phân tách các tham số và thân biểu thức lambda.

Các tham số được đặt trong dấu ngoặc đơn giống như các phương thức và phần thân biểu thức lambda là một khối mã được đặt trong dấu ngoặc nhọn.


10
OP sử dụng JDK 6, vì vậy đây thực sự chỉ là mã gấp của IntelliJ theo câu trả lời của @antonm bên dưới
Sean Landsman

6
@SeanLandsman OP có thể đang sử dụng Java 6, nhưng trong câu hỏi, anh ta nói rằng anh ta đã bắt gặp mã đó ở nơi khác. Là tại sao IntelliJ không báo cáo một lỗi, đó là một điều bí ẩn (có lẽ một phiên bản Java 7 được cài đặt ở đâu đó trong hệ thống OP của). Nhưng đó là cú pháp của biểu thức lambda trong Java, không có câu hỏi nào về nó.
Óscar López

37

Điều này cũng hữu ích khi bạn muốn thực hiện một giao diện chức năng

Runnable r = ()-> System.out.print("Run method");

tương đương với

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };

Tại sao tính năng này được cung cấp?
Akaisteph7

1
@ Akaisteph7 khi bạn không muốn xác định một phương thức vì bạn thấy rằng chỉ có một người gọi sẽ gọi phương thức đó. Trong những trường hợp đó, KHÔNG nên định nghĩa phương thức ở một nơi riêng biệt thay vì truyền vào phần thân của phương thức, đọc về phương thức ẩn danh theo sau bởi lambda.
Vivek Shukla

30

Tôi tin rằng, mũi tên này tồn tại là do IDE của bạn. IntelliJ IDEA làm điều đó với một số mã. Điều này được gọi là mã gấp. Bạn có thể nhấp vào mũi tên để mở rộng nó.


36
@DavidConrad Không, không sai. IntelliJ thực sự gấp các triển khai nội tuyến của các giao diện chức năng để trông giống như lambdas.
balpha

12
Nhìn vào câu hỏi: "Chi tiết: Java 6, Bộ sưu tập Apache Commons, IntelliJ 12" Lambda trong java 6 ???
Anton-M

13

Đó là một biểu hiện lambda.

Nó có nghĩa là, từ listOfCars, arg0 là một trong những mục của danh sách đó. Với mục đó anh ta sẽ làm, do đó ->, bất cứ điều gì bên trong dấu ngoặc.

Trong ví dụ này, anh ấy sẽ trả về một danh sách những chiếc xe phù hợp với điều kiện

Car.SEDAN == ((Car)arg0).getStyle();

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.