2017-10-07 22 views
10

यहाँ एक सरल वर्ग कि मेरी समस्या को दिखाता है के लिए एक विधि संदर्भ की घोषणा करते हैं:जावा 8 मैं कैसे एक अबाध गैर स्थैतिक विधि है कि रिटर्न शून्य

package com.example; 

import java.util.function.*; 

public class App { 

    public static void main(String[] args) { 
     App a1 = new App(); 

     BiFunction<App, Long, Long> f1 = App::m1; 
     BiFunction<App, Long, Void> f2 = App::m2; 

     f1.apply(a1, 6L); 
     f2.apply(a1, 6L); 
    } 

    private long m1(long x) { 
     return x; 
    } 

    private void m2(long x) { 
    } 
} 

f1, App::m1 की चर्चा करते हुए, और a1 करने के लिए बाध्य किया जा रहा f1 पर apply पर कॉल, पूरी तरह से ठीक काम करता है - संकलक खुश है और कॉल f1.apply के माध्यम से ठीक किया जा सकता है।

f2, App::m2 का जिक्र करते हुए, काम नहीं करता है।

मैं बिना किसी वापसी प्रकार के एक अनबाउंड गैर स्थैतिक विधि के विधि संदर्भ को परिभाषित करने में सक्षम होना चाहता हूं, लेकिन मैं इसे काम नहीं कर सकता।

+0

फिर भी 'शून्य! = शून्य 'का एक अन्य शिकार :) – Dariusz

उत्तर

11

BiFunction एक ऐसे फ़ंक्शन का प्रतिनिधित्व करता है जो दो तर्क स्वीकार करता है nd परिणाम उत्पन्न करता है।

मैं कोई वापसी प्रकार के साथ एक अबाध गैर स्थैतिक विधि के लिए एक विधि संदर्भ को परिभाषित करने के

एक BiConsumer बजाय जिन्हें किसी ऑपरेशन है कि दो इनपुट तर्क स्वीकार करता है का प्रतिनिधित्व करता है का उपयोग करने में सक्षम होना चाहते हैं और कोई परिणाम देता है।

BiConsumer<App, Long> f2 = App::m2; 

तो यह परिवर्तन:

f2.apply(a1, 6L); 

यह करने के लिए:

f2.accept(a1, 6L); 
3

विधि संदर्भ अनुप्रयोग :: एम 2, जैसे आपके पास है, लेकिन यह एक BiFunction को आबंटित नहीं है, क्योंकि यह एक मान वापस नहीं करता है, यहां तक ​​कि शून्य मान भी (जो null होना चाहिए)। आपको करना होगा:

f2 = (a,b) -> { m2(a,b); return null; } 

यदि आप एक BiFunction चाहते हैं। वैकल्पिक रूप से, आप अन्य उत्तरों में उल्लिखित एक BiConsumer का उपयोग कर सकते हैं।

संबंधित मुद्दे