से मैं जावा 8 में एक लैम्ब्डा समारोह बनाने के लिए, यह classname है और फिर बाद में अपनी classname से फिर से समारोह का दृष्टांत प्राप्त करना चाहते हैं।का दृष्टांत जावा लैम्ब्डा समारोह नाम
यह है कि मैं क्या करने की कोशिश है:
Exception in thread "main" java.lang.ClassNotFoundException: mypackage.SimpleLambda$$Lambda$1/471910020
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at mypackage.SimpleLambda.main(SimpleLambda.java:12)
:
import java.util.function.Consumer;
public class SimpleLambda
{
public static void call(String aLambdaClassName, String aArg) throws Exception
{
Class<Consumer<String>> lClass = (Class<Consumer<String>>) Class.forName(aLambdaClassName);
Consumer<String> newlamba = lClass.newInstance();
newlamba.accept(aArg);
}
public static void main(String[] args) throws Exception
{
{
// Attempt with a static method as lambda
Consumer<String> lambda = Host::action;
String classname = lambda.getClass().getName();
call(classname, "Hello world");
}
{
// Attempt with a locally defined lambda
Consumer<String> lambda = (s) -> { System.out.println(s); };
String classname = lambda.getClass().getName();
call(classname, "Hello world");
}
}
}
class Host {
public static void action(String aMessage) {
System.out.println(aMessage);
}
}
हालांकि, इस कोड के साथ (दोनों वेरिएंट में, स्थैतिक विधि संदर्भ का उपयोग करते हुए और स्थानीय स्तर पर घोषित लैम्ब्डा का प्रयोग करके), मैं एक अपवाद मिल
मुझे उम्मीद थी कि मैं कम से कम स्थिर विधि संदर्भ को फिर से चालू कर सकता हूं ... नहीं, स्पष्ट रूप से नहीं।
मैं ग्रूवी क्लोजर के साथ एक समान दृष्टिकोण का उपयोग कर दिया है और कहा कि अच्छी तरह से काम किया। तो क्या मैं जावा 8 लैम्बडास के साथ कुछ गलत कर रहा हूं, या नाम से लैम्बडा को तुरंत चालू करना संभव नहीं है? मुझे नेट पर कुछ संकेत मिले कि लैम्बडास (डी) धारावाहिक हो सकता है, इसलिए मैं उम्मीद करता हूं कि नाम से उन्हें तुरंत चालू करना भी संभव हो।
आप उनके साथ क्या करने की कोशिश कर रहे हैं? Lambdas तत्काल नहीं हैं, वे सिर्फ * हैं *। – 4castle
अनिवार्य रूप से, मैं एक लैम्ब्डा को एक स्थिर आंतरिक कक्षा की तरह एक समारोह के साथ इलाज करना चाहता हूं। मैं इसे प्रति वर्ग के नाम से पास करना चाहता हूं क्योंकि मुझे इसे एपीआई के माध्यम से पास करने की आवश्यकता है जो केवल स्ट्रिंग पैरामीटर स्वीकार करता है।तो एक बार जब मैं एपीआई के अंदर नाम प्राप्त करता हूं, तो मैं फिर से अपने क्लासनाम से लैम्ब्डा को फिर से बनाना चाहता हूं ताकि मैं इसे कॉल कर सकूं। अजीब लगता है? हाँ, यह है ... लेकिन जैसा कि मैंने कहा: यह ग्रोवी में किया और अच्छी तरह से काम करता है। मुझे एहसास है कि यह जावा में काम नहीं करेगा, लेकिन अगर किसी के पास यह संकेत है कि यह कैसे करना है, तो वास्तव में अच्छा होगा। – rec
मैंने उपयोग को और स्पष्ट करने के लिए उदाहरण अपडेट किया। – rec