मान लें कि मैं वस्तुओं के संग्रह पर पुन: प्रयास करना चाहता हूं।लैम्ब्डा अभिव्यक्तियों और बेनामी वर्गों के बीच कार्यान्वयन अंतर/अनुकूलन
List<String> strmap = ...
//Without lambdas
strmap.stream().filter(new Predicate<String>() {
public boolean test(String string) {
return string.length == 10;
}
}.forEach(new Consumer<String>() {
public void accept (String string) {
System.out.println("string " + string + " contains exactly 10 characters");
}
}
//With lambdas
strmap.stream()
.filter(s -> s.length == 10)
.forEach(s -> System.out.println("string " + s + " contains exactly 10 characters");
दूसरा उदाहरण (लैम्ब्स के बिना) कैसे काम करता है? प्रत्येक बार जब मैं कोड को कॉल करता हूं, तो एक नया ऑब्जेक्ट (पूर्वानुमान और उपभोक्ता) बनाया जाता है, जावा जैट कंपाइलर लैम्ब्डा अभिव्यक्ति को कितना अनुकूल बना सकता है? एक बेहतर प्रदर्शन के लिए क्या मुझे सभी लैम्बडा को एक चर के रूप में घोषित करना चाहिए और हमेशा केवल एक संदर्भ पास करना चाहिए?
private Predicate<String> length10 = s -> s.length == 10;
private Consumer<String> printer = s -> { "string " + s + " contains exactly 10 characters"; }
strmap.stream()
.filter(length10)
.forEach(printer);
देखें [यहां] (http://stackoverflow.com/q/27524445/2711488)। और [यह] (http://stackoverflow.com/a/23991339/2711488) लैम्बडा अभिव्यक्तियों के साथ-साथ विधि संदर्भों पर भी लागू होता है। हॉटस्पॉट आंतरिक कक्षाओं के अस्थायी उदाहरणों को अनुकूलित कर सकता है, लेकिन स्टेटलेस लैम्ब्डा अभिव्यक्तियों के लिए पहले स्थान पर कोई अस्थायी उदाहरण नहीं हैं। – Holger
@ होल्गर - अच्छे उत्तर – ZhongYu