ตัวดำเนินการลูกศร '->' ทำอะไรใน Java


170

ในขณะที่กำลังค้นหารหัสฉันพบผู้ปฏิบัติงานลูกศรมันทำอะไรกันแน่? ฉันคิดว่า Java ไม่มีโอเปอเรเตอร์ Arrow

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

รายละเอียด : Java 6, Apache Commons Collection, IntelliJ 12

อัปเดต / ตอบ:ปรากฎว่า IntelliJ 12 รองรับ Java 8 ซึ่งรองรับ lambdas และเป็น "การพับ" เพรดิเคตและแสดงเป็น lambdas ด้านล่างคือรหัส "ไม่ถูกพับ"

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

5
โปรดทราบว่าสถานการณ์ที่แน่นอนคือ IntelliJ แสดงรหัสที่มีอยู่เป็นนิพจน์แลมบ์ดาเพื่อให้อ่านง่ายขึ้น รหัสที่แท้จริงไม่ใช่การแสดงออกแลมบ์ดา
Thorbjørn Ravn Andersen

คำตอบ:


125

ว่าเป็นส่วนหนึ่งของไวยากรณ์ของการแสดงออกแลมบ์ดาใหม่ที่จะนำมาใช้ใน Java 8. มีคู่ของบทเรียนออนไลน์ที่จะได้รับการแขวนของมันเป็นที่นี่เป็นความเชื่อมโยงให้เป็นหนึ่ง โดยพื้นฐานแล้วการ->แยกพารามิเตอร์ (ด้านซ้าย) จากการใช้งาน (ด้านขวา)

ไวยากรณ์ทั่วไปสำหรับการใช้แลมบ์ดานิพจน์คือ

(พารามิเตอร์) -> {Body} โดยที่ '->' คั่นพารามิเตอร์และเนื้อหาการแสดงออกแลมบ์ดา

พารามิเตอร์ถูกล้อมรอบในวงเล็บซึ่งเป็นวิธีเดียวกับวิธีการและร่างกายแสดงออกแลมบ์ดาเป็นบล็อกของรหัสที่อยู่ในวงเล็บปีกกา


10
OP ที่ใช้ JDK 6 ดังนั้นนี่เป็นเพียงรหัสพับ IntelliJ ตาม @antonm คำตอบด้านล่าง
Sean Landsman

6
@SeanLandsman OP อาจใช้ Java 6 แต่ในคำถามที่เขาระบุว่าเขาเจอรหัสนั้นในที่อื่น ว่าทำไม IntelliJ ไม่ได้รายงานข้อผิดพลาดที่ลึกลับ (อาจจะมีอยู่ในจาวา 7 รุ่นที่ติดตั้งที่ไหนสักแห่งในระบบของ OP) แต่นั่นเป็นไวยากรณ์ของแลมบ์ดานิพจน์ใน Java ไม่มีคำถามเกี่ยวกับเรื่องนี้
ÓscarLópez

37

อันนี้มีประโยชน์เช่นกันเมื่อคุณต้องการใช้อินเตอร์เฟซที่ใช้งานได้

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

เทียบเท่ากับ

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

เหตุใดคุณสมบัตินี้จึงมีให้
Akaisteph7

1
@ Akaisteph7 เมื่อคุณไม่ต้องการกำหนดวิธีการเพราะคุณพบว่ามีผู้โทรเพียงคนเดียวเท่านั้นที่จะเรียกวิธีการนั้น ในกรณีเหล่านั้นมันไม่เหมาะสมที่จะกำหนดวิธีการในที่แยกต่างหากแทนที่จะส่งผ่านในเนื้อความของวิธีการอ่านเกี่ยวกับวิธีที่ไม่ระบุชื่อตามด้วยแลมบ์ดา
Vivek Shukla

30

ฉันเชื่อว่าลูกศรนี้มีอยู่เนื่องจาก IDE ของคุณ IntelliJ IDEA ทำสิ่งนี้ด้วยรหัสบางส่วน สิ่งนี้เรียกว่าการพับโค้ด คุณสามารถคลิกที่ลูกศรเพื่อขยาย


36
@ DavidConrad ไม่ไม่ผิด IntelliJ ทำหน้าที่นำอินเทอร์เฟซการใช้งานแบบอินไลน์ไปเป็นรูปตัว lambdas
balpha

12
ดูคำถาม: "รายละเอียด: Java 6, Apache Commons Collection, IntelliJ 12" แลมบ์ดาใน java 6 ???
Anton-M

13

มันเป็นการแสดงออกของแลมบ์ดา

หมายความว่าจาก listOfCars, arg0 เป็นหนึ่งในรายการของรายการนั้น ด้วยไอเท็มนั้นเขาจะทำดังนั้น -> อะไรก็ตามที่อยู่ในวงเล็บ

ในตัวอย่างนี้เขาจะส่งคืนรายการรถยนต์ที่เหมาะสมกับสภาพ

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

2

ผู้ประกอบการใหม่สำหรับการแสดงออกแลมบ์ดาเพิ่มใน java 8

การแสดงออกของแลมบ์ดาเป็นวิธีการเขียนวิธีสั้น ๆ
มันถูกใช้ทางอ้อมเพื่อใช้งานส่วนต่อประสานการทำงาน

ไวยากรณ์หลัก: (พารามิเตอร์) -> {คำสั่ง; }

มีกฎพื้นฐานบางประการสำหรับการแสดงออกแลมบ์ดาที่มีประสิทธิภาพซึ่งคุณควรรู้ไหม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.