2015-09-01 10 views
8

मैं निम्नलिखित कोड है:जावा 8 - पैरामीटर के साथ फ़ंक्शन वाले भविष्यवाणी का उपयोग कैसे करें?

public boolean isImageSrcExists(String imageSrc) { 
    int resultsNum = 0; 
    List<WebElement> blogImagesList = driver.findElements(blogImageLocator); 

    for (WebElement thisImage : blogImagesList) { 
     if (thisImage.getAttribute("style").contains(imageSrc)) { 
      resultsNum++; 
     } 
    } 

    if (resultsNum == 2) { 
     return true; 
    } else { 
     return false; 
    } 
} 

यह जावा 8 Stream रों उपयोग करने के लिए परिवर्तित करने की उचित तरीका क्या है?

जब मैं map() का उपयोग करने का प्रयास कर रहा हूं, तो मुझे getAttributeFunction से कोई त्रुटि नहीं मिली है।

int a = (int) blogImagesList.stream() 
          .map(WebElement::getAttribute("style")) 
          .filter(s -> s.contains(imageSrc)) 
          .count(); 
+1

हम कुछ "करी" thingy कर सकता है, लेकिन यह शायद इसके लायक नहीं है - 'करी (:: getAttribute, "style") ' – ZhongYu

उत्तर

10

आप वास्तव में आप क्या चाहते हैं नहीं कर सकते: आप के बजाय एक लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं।

लेकिन तुम कर सकते थे ...

... एक विधि है कि एक बूलियन वापस आती है और getAttribute("style") करने के लिए कॉल harcoded बनाएँ:

public boolean getAttribute(final T t) { 
    return t.getAttribute("style"); 
} 

यह आपको विधि रेफरी का उपयोग करने की अनुमति होगी:

int a = (int) blogImagesList.stream() 
       .map(this::getAttribute) 
       .filter(s -> s.contains(imageSrc)) 
       .count(); 

... या आप समारोह आयोजित करने के लिए एक चर निर्धारित कर सकते हैं:

final Function<T, R> mapper = t -> t.getAttribute("style"); 

यह तो आप बस चर

int a = (int) blogImagesList.stream() 
       .map(mapper) 
       .filter(s -> s.contains(imageSrc)) 
       .count(); 

पारित करने के लिए अनुमति होगी ... या आप करी और ऊपर दो दृष्टिकोण जोड़ सकता तो (यह निश्चित रूप से बुरी तरह overkill है)

public Function<T,R> toAttributeExtractor(String attrName) { 
    return t -> t.getAttribute(attrName); 
} 

तुम करोगी map में एक Function पाने के लिए toAttributeExtractor फोन और पारित करने के लिए है कि जरूरत है:

final Function<T, R> mapper = toAttributeExtractor("style"); 
int a = (int) blogImagesList.stream() 
       .map(mapper) 
       .filter(s -> s.contains(imageSrc)) 
       .count(); 

हालांकि, वास्तविक, बस एक लैम्ब्डा का उपयोग कर आसान होगा (जैसा कि आप अगली पंक्ति पर करते हैं):

int a = (int) blogImagesList.stream() 
       .map(t -> t.getAttribute("style")) 
       .filter(s -> s.contains(imageSrc)) 
       .count(); 
+1

अंत में समाधान पर सीधे जाने के बजाय आपके पास इन सभी अजीब समाधान क्यों हैं? –

+1

@ लुइस वासरमैन क्योंकि ओपी एक कामकाज चाहता था - मैं यह स्पष्ट करना चाहता था कि ओपी पहले से ही सरल समाधान का उपयोग कर रहा था। –

5

आप विधि संदर्भ में पैरामीटर पास नहीं कर सकते हैं। स्पष्ट मानकों विधि संदर्भ में अनुमति नहीं है -

int a = (int) blogImagesList.stream() 
          .map(w -> w.getAttribute("style")) 
          .filter(s -> s.contains(imageSrc)) 
          .count(); 
+3

मैंने कोड को स्वरूपित करने की स्वतंत्रता ली है ताकि आप स्क्रॉल किए बिना इसे पढ़ सकें। –

+1

@ पीटर लेवरी धन्यवाद :) – Eran

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