2016-04-08 7 views
12

मैं कोड Cookies से अधिक जो दोहराता कुकी जिसका नाम से मेल खाता CookieSession.NAMEलैम्ब्डा अभिव्यक्ति के लिए सरणी यात्रा परिवर्तित

Cookie[] cookies = httpServletRequest.getCookies(); 
     LOGGER.info("Clearing cookies on welcome page"); 
     if (cookies != null) 
      for (Cookie cookie : cookies) { 
       if (cookie.getName().equals(CookieSession.NAME)) {      
       cookie.setValue(null); 
       cookie.setMaxAge(0); 
       cookie.setPath("/"); 
       httpServletResponse.addCookie(cookie); 
       } 
      } 

कोई यह जावा 8 लैम्ब्डा अभिव्यक्ति का उपयोग कर सरल बना सकते हैं पुनर्स्थापित करने के लिए नीचे दिए गए है

+3

हां। लेकिन आप अपनी स्थिति – njzk2

+7

में '{}' की कमी को ठीक करके शुरू कर सकते हैं वास्तव में नहीं, नहीं। यह सरलीकृत नहीं किया जाएगा; यह मूल रूप से वही होगा लेकिन थोड़ा _more_ जटिल होगा। –

+0

लैम्ब्डास इसे आसान बनाने वाला नहीं है। धीमी, अधिक स्मृति-भारी, लेकिन आसान नहीं है। – Boann

उत्तर

8

सुनिश्चित नहीं हैं कि अगर यह होगा सरल किया जा है, लेकिन यह, किया जा सकता है हाँ:

Arrays.stream(cookies) 
     .filter(c -> c.getName().equals(CookieSession.NAME)) 
     .forEach(cookie -> { 
      cookie.setValue(null); 
      cookie.setMaxAge(0); 
      cookie.setPath("/"); 
      httpServletResponse.addCookie(cookie); 
     }); 
+2

तकनीकी रूप से यह बराबर नहीं होगा क्योंकि ओपी के कोड में ब्रैकेट गुम हैं और केवल पहला सेटटर इस पर निर्भर करेगा ... लेकिन फिर भी आपका कोड वह अपेक्षा करता है जो वह उम्मीद करता है। –

+1

यह इंगित करने लायक है कि शून्य जांच अभी भी करने की आवश्यकता है। 'httpServletRequest.getCookies() 'कोई' कुकी नहीं है 'और' Arrays.stream' शून्य-सहिष्णु नहीं है 'वापस' शून्य 'देता है। इसके अलावा, चूंकि 'HttpServletResponse' को थ्रेड-सुरक्षित के रूप में निर्दिष्ट नहीं किया गया है,'forEeach' को' eEEOOered ' – Misha

5

for पाश एक +०१२३३७७७४७५० साथ प्रतिस्थापित किया जा सकता हैअभिव्यक्ति:

Arrays.stream(cookies) 
     .filter(c -> c.getName().equals(CookieSession.NAME)) 
     .forEach(c -> {c.setValue(null); 
        c.setMaxAge(0); 
        c.setPath("/"); 
        httpServletResponse.addCookie(c); 
        }); 
5
Arrays.stream(httpsServletRequest.getCookies()) 
    .filter(cookie -> CookieSession.NAME.equals(cookie.getName())) 
    .forEach(cookie -> { 
     cookie.setValue(null); 
     cookie.setMaxAge(0); 
     cookie.setPath("/"); 
     httpServletResponse.addCookie(cookie); 
    }); 
5

अन्य उत्तर if (cookies != null) नजरअंदाज किया है लगते हैं। इसके अलावा मुझे ब्लॉक के बजाए कई इंटरमीडिएट ऑपरेशंस के लिए peek पसंद है। मुझे स्पष्ट लगता है।

Optional.ofNullable(httpServletRequest.getCookies()) 
    .ifPresent(cookies -> Arrays.stream(cookies) 
     .filter(cookie -> cookie.getName().equals(CookieSession.NAME)) 
     .peek(cookie -> cookie.setValue(null)) 
     .peek(cookie -> cookie.setMaxAge(0)) 
     .peek(cookie -> cookie.setPath("/")) 
     .forEach(httpServletResponse::addCookie)); 
4

लैम्ब्डा या forEach का उपयोग करके इसे सरल बनाना संभव नहीं है।

इसके अलावा, कई लोगों को लगता है कि आप forEach उपयोग नहीं करना चाहिए इस तरह एक लाइन में राज्य उत्परिवर्तित करने के लिए:

cookies.forEach(cookie -> httpServletResponse.addCookie(cookie)); 

बहरहाल, यह वास्तव में शैली की बात है। जब तक forEach तत्वों को अनुक्रमिक रूप से (समानांतर के बजाए) उपभोग करता है, तो ऐसा कुछ भी नहीं है जो वास्तव में उस तरह की रेखा के परिणामस्वरूप गलत हो सकता है।

Here is Oracle's advice on the subject

मेरी राय में, आपको अपना कोड छोड़ देना चाहिए।

+0

के साथ बेहतर रूप से बदला जा सकता है, मुझे चिंता है कि ओरेकल की सलाह के बारे में आपका बयान कुछ पाठकों को गुमराह कर सकता है। 'प्रत्येक के लिए' में राज्य को संशोधित करने के बारे में कुछ भी असुरक्षित नहीं है। आपके द्वारा प्रदान किया गया लिंक स्टाइलिस्ट कारणों के लिए 'forEach' के उपयोग के खिलाफ तर्क देता है - मैपिंग और कमी का उपयोग करके बेहतर कार्यात्मक समाधान के बारे में सोचने के सबूत प्रदान करने के रूप में। – sprinter

+1

संपादन के लिए धन्यवाद। भ्रम से बचने के लिए मैं अपनी मूल टिप्पणी हटा दूंगा। मैं वास्तव में आपके बिंदु से सहमत हूं कि नया संस्करण कोई बेहतर है या नहीं। लेकिन ऐसा लगता है कि दुनिया कार्यात्मक हो रही है इसलिए हम बेहतर इस्तेमाल करेंगे :-) – sprinter

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