जावा 8 Stream
एपीआई डिजाइन की समीक्षा, मैं Stream.reduce()
तर्क पर सामान्य निश्चरता से आश्चर्यचकित था:Stream.reduce() जैसे API में invariance चुनने के अच्छे कारण क्या हैं?
<U> U reduce(U identity,
BiFunction<U,? super T,U> accumulator,
BinaryOperator<U> combiner)
ही एपीआई का एक उचित रूप में अधिक बहुमुखी संस्करण U
को सहप्रसरण/व्यक्तिगत संदर्भों पर contravariance आवेदन किया है हो सकता है, इस तरह के के रूप में:
// Assuming we want to reuse these tools all over the place:
BiFunction<Number, Number, Double> numberAdder =
(t, u) -> t.doubleValue() + u.doubleValue();
// This currently doesn't work, but would work with the suggestion
Stream<Number> stream = Stream.of(1, 2L, 3.0);
double sum = stream.reduce(0.0, numberAdder, numberAdder);
:
<U> U reduce(U identity,
BiFunction<? super U, ? super T, ? extends U> accumulator,
BiFunction<? super U, ? super U, ? extends U> combiner)
इस के बाद, जो संभव नहीं है, वर्तमान में के लिए अनुमति होगी
वर्कअराउंड, उपयोग विधि संदर्भ "मजबूर" करने के लिए लक्ष्य प्रकार में प्रकार:
double sum = stream.reduce(0.0, numberAdder::apply, numberAdder::apply);
सी # इस विशेष समस्या नहीं है, के रूप में Func(T1, T2, TResult)
इस प्रकार परिभाषित किया गया है, घोषणा-साइट विचरण का उपयोग कर, जिसका अर्थ है सुझाव डिजाइन पर मौजूदा डिजाइन के
public delegate TResult Func<in T1, in T2, out TResult>(
T1 arg1,
T2 arg2
)
क्या फायदे हैं (और संभवतः, ईजी निर्णय के लिए कारणों): Func
उपयोग कर किसी भी एपीआई मुक्त करने के लिए इस व्यवहार हो जाता है?
या, अलग-अलग पूछा गया कि मैं सुझाए गए डिज़ाइन की चेतावनी क्या कर सकता हूं (उदाहरण के लिए अनुमान की कठिनाइयों, समांतरता बाधाएं, या कमीशन ऑपरेशन जैसे विशिष्टता जैसे विशिष्टता, भविष्य की जावा की घोषणा की प्रत्याशा- BiFunction<in T, in U, out R>
पर साइट भिन्नता, ...)?
मैं जवाब देता है संदिग्ध वहाँ टाइप अनुमान को कठिन esp बना देगा क्योंकि मुझे संदेह है कि यह स्पष्ट होने के बिना कुछ प्रकार के अनावश्यक छोड़ देगा (टाइप अनुमान के बिंदु को हराकर) –
@ पीटर लेवरी: यह मेरी चिंता भी थी, लेकिन 1) क्या आप इसे साबित कर सकते हैं? :) 2) स्कैला जानता है 'ट्रैवर्सएबलऑन.ड्यूज [ए 1>: ए] (सेशन: (ए 1, ए 1) ⇒ ए 1): ए 1' –
एक तरीका इस तरह एक एपीआई लिखना होगा और देखें कि जब आप उपयोग करने का प्रयास करते हैं तो क्या होता है यह। –