2017-11-13 26 views
7

मेरे कार्यक्रम को कम करने के लिए इस लाइन है। कम दस्तावेज का कहना है कि पारित समारोह सहयोगी होना चाहिए।एक गैर साहचर्य समारोह पासिंग

मैं इसे एक अभिव्यक्ति के रूप में कैसे लिख सकता हूं जो अनुबंध को कम नहीं करता है?

+3

आप नहीं कर सकते। बस एक गूढ़ पुराने पाश का उपयोग करें। –

+0

क्या आप फंक्शन 'एफ' या' (ए, बी) -> 2 * ए + बी' के बारे में बात कर रहे हैं? अगर यह 'एफ' है, तो मुझे लगता है कि किसी भी समांतर धारा में इसका उपयोग करना सुरक्षित है; अगर यह '(ए, बी) -> 2' है, तो यह भी ठीक रहेगा क्योंकि मुझे ऐसा करने का कोई कारण नहीं दिख रहा है:' s.chars()। समानांतर()। कम करें (0, (ए, बी) - > 2 * ए + बी) ' –

उत्तर

4

वर्तमान कार्यान्वयन के तहत और आप आईएफएफ समानांतर उपयोग करने के लिए नहीं जा रहे हैं - तुम क्या आप अभी से सुरक्षित हैं। जाहिर है अगर आप इन अस्वीकरण के साथ ठीक हैं।

या आप स्पष्ट रूप से पाश के लिए एक साथ समारोह बना सकते हैं:

Function<String, Integer> f = s -> { 
     int first = s.charAt(0) * 2 + s.charAt(1); 
     int total = first; 

     for (int x = 1; x < s.length() - 1; x++) { 
      total = total * 2 + s.charAt(x + 1); 
     } 

     return total; 

    }; 
+0

यह वास्तव में 'वर्तमान कार्यान्वयन के तहत' भाग है जो मुझे परेशान करता है। जावा देवों ने शांतिपूर्वक यह बदलने का अधिकार सुरक्षित रखा है कि यह कैसे काम करता है। –

+0

शांतिपूर्वक? आप इसका मतलब है कि इस पर लड़ाई करने का विरोध है? –

+0

@ निकोडेल हाँ, यह कड़वा हिस्सा है। आप अभी भी लूप के लिए एक 'फंक्शन' बना सकते हैं (पोस्ट संपादित किया गया है) – Eugene

3

आप के रूप List.hashCode() के उदाहरण को this answer में बताया गया है, एक साहचर्य समारोह को यह समारोह बदल सकते हैं। अंतर केवल कारक में है (2 बनाम 31) और प्रारंभ मूल्य (1 बनाम 0)।

यह अपने कार्य है, जो विशेष रूप से आसान है, आप एक String की तरह एक यादृच्छिक अभिगम इनपुट है जब करने के लिए अनुकूलित किया जा सकता:

Function<String, Integer> f = 
    s -> IntStream.range(0, s.length()).map(i -> s.charAt(i)<<(s.length()-i-1)).sum(); 

यह भी समानांतर में चलाने होगा, लेकिन यह संभावना नहीं है कि आप कभी भी इस तरह के humongous मुठभेड़ स्ट्रिंग्स कि समानांतर मूल्यांकन लाभ प्रदान करता है। तो क्या रहता है, कि ज्यादातर लोगों को इस समाधान कम एक सरल for पाश से पठनीय पर विचार हो सकता ...


ध्यान दें कि ऊपर समाधान एक अलग अतिप्रवाह व्यवहार, यानी अगर String 32 से अधिक char रों है, कारण दर्शाती है दो के साथ गुणा करने के बजाय शिफ्ट ऑपरेटर के उपयोग के लिए।
इस समस्या के लिए फिक्स समाधान भी अधिक कुशल बनाता है: स्ट्रिंग 32 से अधिक char रों है

Function<String, Integer> f = s -> 
    IntStream.range(Math.max(0, s.length()-32), s.length()) 
      .map(i -> s.charAt(i)<<(s.length()-i-1)).sum(); 

, तो वह केवल प्रक्रियाओं पिछले 32 char है, जो पहले से ही के रूप में ही परिणाम की गणना करने के लिए पर्याप्त है आपका मूल कार्य

+0

मैं वास्तव में एक हैश फ़ंक्शन लिख रहा हूं - मैं एक सरल, आत्मनिर्भर, उदाहरण प्रदान करने की कोशिश कर रहा था। दूसरे प्रश्न के लिंक के लिए धन्यवाद - मैंने सोचा कि मैंने डुप्लीकेट की खोज अच्छी तरह से की है, लेकिन स्पष्ट रूप से नहीं। –

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