ส่วนต่อประสานการทำงานของ Java 8 ที่ไม่มีอาร์กิวเมนต์และไม่มีค่าส่งคืน


110

อะไรคืออินเทอร์เฟซการทำงานของ Java 8 สำหรับวิธีการที่ไม่ใช้อะไรเลยและไม่ส่งคืนอะไรเลย

กล่าวคือเทียบเท่ากับ C # ที่ไม่มีพารามิเตอร์ที่Actionมีvoidชนิดส่งคืน?

คำตอบ:


98

void m()ถ้าผมเข้าใจอย่างถูกต้องคุณต้องการอินเตอร์เฟซที่ใช้งานได้กับวิธีการ ในกรณีนี้คุณสามารถใช้ไฟล์Runnable.


29
Runnableข้อกำหนดอินเทอร์เฟซของอินเทอร์เฟซระบุว่าเป็นการจัดเตรียมโค้ดปฏิบัติการให้กับThreadคลาส ดูเหมือนจะไม่ถูกต้องสำหรับฉันที่จะใช้ในRunnableที่ที่ไม่ได้มีไว้สำหรับการดำเนินการโดยเธรด ดูเหมือนจะทำให้เข้าใจผิด Runnableถูกกำหนดให้เป็นFunctionalInterfaceเนื่องจากเป็นไปตามข้อกำหนดของอินเทอร์เฟซที่ใช้งานได้และสามารถสร้างได้โดยใช้ไวยากรณ์แลมบ์ดา ทำไมไม่สร้างอินเทอร์เฟซการทำงานของคุณเอง ดูRunnableดูFunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnableมีคำอธิบายประกอบ@FunctionalInterfaceและ (ii) แม้ในบริบทของนิพจน์แลมบ์ดามันจะถูกดำเนินการบนเธรด: เธรดที่แลมบ์ดารันซึ่งอาจเป็นเธรดปัจจุบัน ...
assylias

9
ฉันเห็นด้วยกับ @TheSecretSquad แม้ว่าจะเป็นไปตามข้อกำหนดด้านฟังก์ชัน แต่ก็ไม่ได้ฟังดูมีความหมายมากนัก Runnable มักเกี่ยวข้องกับการสร้างเธรด อินเทอร์เฟซการทำงานที่เรียบง่ายของ Worker ด้วยวิธี doWork น่าจะดี แก้ไข: อ๊ะ: stackoverflow.com/questions/27973294/…
jpangamarca

6
ค้นหา "อุ๊บ" ของ @jpangamarca ด้านบน: ในความคิดเห็นเกี่ยวกับคำถามซ้ำที่เขาเชื่อมโยง Brian Goetz ยืนยันว่าRunnableมีจุดประสงค์เพื่อใช้เพื่อจุดประสงค์นี้ไม่ใช่เฉพาะกับบริบทของเธรด
Joshua Goldberg

10
เนื่องจากเป็นเช่นนั้นฉันคิดว่าควรทำให้ javadoc เป็นแบบทั่วไปมากขึ้น: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg

15

เพียงแค่ทำของคุณเอง

@FunctionalInterface
public interface Procedure {
    void run();

    default Procedure andThen(Procedure after){
        return () -> {
            this.run();
            after.run();
        };
    }

    default Procedure compose(Procedure before){
        return () -> {
            before.run();
            this.run();
        };
    }
}

และใช้แบบนี้

public static void main(String[] args){
    Procedure procedure1 = () -> System.out.print("Hello");
    Procedure procedure2 = () -> System.out.print("World");

    procedure1.andThen(procedure2).run();
    System.out.println();
    procedure1.compose(procedure2).run();

}

และผลลัพธ์

HelloWorld
WorldHello

ฉันรู้สึกจริงๆด้วยเหตุผลของคำถามว่านี่ควรเป็นคำตอบที่ยอมรับได้
corsiKa

0

@FunctionalInterface อนุญาตเฉพาะเมธอดนามธรรมดังนั้นคุณสามารถอินสแตนซ์อินเทอร์เฟซนั้นด้วยนิพจน์แลมบ์ดาดังต่อไปนี้และคุณสามารถเข้าถึงสมาชิกอินเทอร์เฟซได้

        @FunctionalInterface
        interface Hai {

            void m2();

            static void m1() {
                System.out.println("i m1 method:::");
            }

            default void log(String str) {
                System.out.println("i am log method:::" + str);
            }

        }

    public class Hello {
        public static void main(String[] args) {

            Hai hai = () -> {};
            hai.log("lets do it.");
            Hai.m1();

        }
    }


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