Apa yang dilakukan operator panah, '->', di Jawa?

171

Saat berburu melalui beberapa kode saya menemukan operator panah, apa fungsinya? Saya pikir Java tidak memiliki operator panah.

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

Detail : Java 6, Koleksi Apache Commons, IntelliJ 12

Pembaruan / Jawaban: Ternyata IntelliJ 12 mendukung Java 8, yang mendukung lambdas, dan "melipat" Predikat dan menampilkannya sebagai lambdas. Di bawah ini adalah kode "un-folded".

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});
Mike Rylander
sumber
5
Perhatikan bahwa skenario persisnya adalah IntelliJ merender kode yang ada sebagai ekspresi lambda untuk membuatnya lebih mudah dibaca. Kode aktual bukan ekspresi lambda.
Thorbjørn Ravn Andersen

Jawaban:

125

Itu bagian dari sintaks ekspresi lambda baru, yang akan diperkenalkan di Java 8. Ada beberapa tutorial online untuk memahami hal itu, ini tautannya . Pada dasarnya, ->memisahkan parameter (sisi kiri) dari implementasi (sisi kanan).

Sintaks umum untuk menggunakan ekspresi lambda adalah

(Parameter) -> {Tubuh} di mana '->' memisahkan parameter dan tubuh ekspresi lambda.

Parameter terlampir dalam tanda kurung yang merupakan cara yang sama seperti untuk metode dan tubuh ekspresi lambda adalah blok kode yang tertutup dalam kurung kurawal.

Óscar López
sumber
10
OP menggunakan JDK 6, jadi ini benar-benar hanya kode lipat IntelliJ sesuai jawaban @anton di bawah ini
Sean Landsman
6
@SeanLandsman OP mungkin menggunakan Java 6, tetapi dalam pertanyaan dia menyatakan bahwa dia menemukan kode itu di tempat lain. Mengapa IntelliJ tidak melaporkan kesalahan, itu misteri (mungkin ada adalah versi Java 7 diinstal di suatu tempat dalam sistem OP). Tapi itu sintaks ekspresi lambda di Jawa, tidak ada pertanyaan tentang itu.
Óscar López
37

Yang ini berguna juga ketika Anda ingin mengimplementasikan antarmuka fungsional

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

setara dengan

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };
Justin Patel
sumber
mengapa fitur ini disediakan?
Akaisteph7
1
@ Akaisteph7 ketika Anda tidak ingin mendefinisikan metode karena Anda menemukan bahwa hanya satu pemanggil yang akan memanggil metode itu. Dalam kasus-kasus tersebut, masuk akal untuk TIDAK mendefinisikan metode di tempat yang terpisah, alih-alih lewat di tubuh metode, membaca tentang metode anonim diikuti oleh lambda.
Vivek Shukla
30

Saya percaya, panah ini ada karena IDE Anda. IntelliJ IDEA melakukan hal semacam itu dengan beberapa kode. Ini disebut kode lipat. Anda dapat mengklik tanda panah untuk meluaskannya.

Anton-M
sumber
36
@ Davidvidon Tidak, tidak salah. IntelliJ memang melipat implementasi inline dari antarmuka fungsional agar terlihat seperti lambdas.
balpha
12
Lihatlah pertanyaan: "Detail: Java 6, Apache Commons Collection, IntelliJ 12" Lambda in java 6 ???
Anton-M
13

Itu ungkapan lambda.

Ini berarti bahwa, dari listOfCars, arg0 adalah salah satu item dari daftar itu. Dengan item yang akan dia lakukan, maka ->, apa pun yang ada di dalam kurung.

Dalam contoh ini, dia akan mengembalikan daftar mobil yang sesuai dengan kondisinya

Car.SEDAN == ((Car)arg0).getStyle();
thomas sederhana
sumber