अमरूद पुस्तकालय: इसकी सबसे उपयोगी और / या छिपी हुई विशेषताएँ क्या हैं? [बन्द है]


131

मेरे पास अमरूद एपीआई का एक त्वरित स्कैन और इसके द्वारा प्रदान किए गए नए संग्रह प्रकार हैं ( Multimapऔर BiMapउदाहरण के लिए उपयोगी दिखाई देते हैं) और मैं इस परियोजना में पुस्तकालय को शामिल करने के बारे में सोच रहा हूं।

हालाँकि, मेरे पास लाइब्रेरी विली-नीली को शामिल करने की भी संभावना है, यदि वे बिना किसी बड़े लाभ के हैं और मूल्यवान समय को सीखते हुए सुविधाएँ सीखते हैं।

क्या आपने अपनी परियोजना में अमरूद पुस्तकालय को शामिल किया है और क्या यह किसी भी अप्रत्याशित तरीके से उपयोगी साबित हुआ है? क्या आप हमेशा भविष्य में इसका इस्तेमाल करेंगे? इसका मुख्य लाभ / समय सेवर क्या रहा है? इसकी छिपी विशेषताएं क्या हैं?


4
आपका शीर्षक और आपका प्रश्न वास्तव में मेल नहीं खाते हैं।
aioobe

4
"नए संग्रह प्रकार ... उपयोगी दिखाई देते हैं" और "पुस्तकालयों को शामिल करने के लिए मेरे पास एक मितव्ययिता है ... यदि वे कोई बड़े लाभ के नहीं हैं" - तो यह कौन सा है? आपको या तो लगता है कि पुस्तकालय उपयोगी है और आपको लाभ है या नहीं
मैट बी

2017 के अनुसार (अब प्रश्न बंद), यदि आप नवीनतम ग्रेडल (4.4.1) अमरूद 21.0 का उपयोग कर रहे हैं, तो इसे एक निर्भरता के रूप में डिफ़ॉल्ट रूप से build.gradle में जोड़ा जाता है, शब्दों के साथ "यह निर्भरता आंतरिक रूप से उपयोग की जाती है, और उपभोक्ताओं के संपर्क में नहीं है। अपने स्वयं के संकलन क्लासपैथ पर ", यह सुझाव देते हुए कि ग्रैडल टीम ने फैसला किया है कि वहाँ वास्तव में कुछ मूल्यवान सामान है।
माइक कृंतक

जवाबों:


158

गंभीरता से, अमरूद में सब कुछ उपयोगी है। मैं इसे काफी समय से उपयोग कर रहा हूं, और मैं अभी भी कुछ नया खोज रहा हूं जो मैं इसके साथ कर सकता हूं जो इसे हाथ से करने से कम कोड लेता है।

कुछ चीजें दूसरों ने वास्तव में उल्लेख नहीं किया है कि मैं प्यार करता हूं:

  • Multimaps अभी महान हैं। किसी भी समय आप जैसे कुछ का उपयोग करेंगे Map<Foo, Collection<Bar>>, इसके बजाय एक मल्टीमैप का उपयोग करें और अपने आप को एक मौजूदा संग्रह के लिए थकाऊ जाँच का एक टन बचाएं और यदि यह नहीं है, तो इसे बनाने और जोड़ने के लिए मैप किया जाएगा।
  • Orderingइमारत के लिए महान है Comparatorकि आप कैसे चाहते हैं व्यवहार करते हैं।
  • Maps.uniqueIndexऔर Multimaps.index: ये विधियां एक Iterableए और एक Functionनिर्माण करती हैं ImmutableMapया एक फ़ंक्शन को प्रत्येक के लिए फ़ंक्शन को लागू करने के परिणामस्वरूप ImmutableListMultimapमूल्यों को अनुक्रमित Iterableकरती हैं। तो एक फ़ंक्शन के साथ जो किसी आइटम की आईडी को पुनर्प्राप्त करता है, आप एक पंक्ति में उनके आईडी द्वारा आइटम की सूची को अनुक्रमित कर सकते हैं।
  • कार्यात्मक सामान यह प्रदान करता है ... filter, transformआदि Functionएस और Predicateएस के लिए कक्षाओं का उपयोग करने की क्रिया के बावजूद , मैंने इसे उपयोगी पाया है। मैं यहाँ इसे अच्छी तरह से पढ़ने के लिए एक तरीका बताता हूँ ।
  • ComparisonChainएक छोटा, आसानी से अनदेखा वर्ग है जो तब उपयोगी होता है जब आप एक तुलना विधि लिखना चाहते हैं जो उत्तराधिकार में कई मूल्यों की तुलना करता है और पहला अंतर पाए जाने पर वापस लौट जाना चाहिए। यह उस के सभी टेडियम को हटा देता है, जिससे यह जंजीर विधि की कुछ पंक्तियों को कॉल करता है।
  • Objects.equal(Object,Object) - अशक्त सुरक्षित बराबर।
  • Objects.hashCode(Object...) - अपनी कक्षा के कई क्षेत्रों के आधार पर हैश कोड प्राप्त करने का आसान तरीका।
  • Objects.firstNonNull(Object,Object) - पहला मान शून्य होने पर डिफ़ॉल्ट मान प्राप्त करने के लिए कोड को कम कर देता है, खासकर यदि पहला मान विधि कॉल का परिणाम है (आपको इसे सामान्य तरीके से करने से पहले एक चर पर असाइन करना होगा)।
  • CharMatcherएस पहले से ही उल्लेख किया गया था, लेकिन वे बहुत शक्तिशाली हैं।
  • Throwablesआपको थ्रैबल्स के साथ कुछ अच्छी चीजें करने की अनुमति देता है, जैसे कि Throwables.propagateएक फेंकने योग्य को पुन: फेंकता है यदि यह एक है RuntimeExceptionया Errorइसे एक में लपेटता है RuntimeExceptionऔर अन्यथा फेंकता है।

मैं निश्चित रूप से आगे बढ़ सकता था, लेकिन मुझे काम करना है। =) वैसे भी, मेरी कुछ चीज़ें जो मुझे यहाँ पसंद हैं, सूचीबद्ध होने के बावजूद, यह तथ्य यह है कि अमरूद का सब कुछ किसी न किसी स्थिति में उपयोगी है। इसका अधिकांश भाग बहुत बार उपयोगी होता है। जैसा कि आप इसका उपयोग करते हैं, आप अधिक उपयोगों की खोज करेंगे। इसका इस्तेमाल न करने से ऐसा लगेगा जैसे एक हाथ आपकी पीठ के पीछे बंधा हो।


2
पूरी तरह से सहमत हूँ ComparisionChain
व्हिस्की सियरा

44

मैंने कुछ वर्षों से Google के अंदर अमरूद का उपयोग प्रभावी ढंग से किया है - और यह अद्भुत है।

भागों मैं विशेष रूप से शौकीन हैं:

  • Charsets.* - इतना सरल, इतना उपयोगी
  • संग्रह
  • आईओ हैंडलिंग (एक पंक्ति में पूरी तरह से एक संसाधन पढ़ें, आदि)
  • Splitter/Joiner
  • Preconditions

6
ध्यान दें कि अब हमारे पास जावा 7+ में StandardCharsets हैं । मुझे आश्चर्य है कि जावा में कई अन्य अमरूद की विशेषताओं ने अपना रास्ता खोज लिया है।
डेविड

1
मुझे यह मॉर्डनाइज़र मावेन प्लगिन मिला, जो विरासत एपीआई के उपयोग का पता लगाता है, जिसमें अमरूद जैसे तीसरे पक्ष के पुस्तकालय भी शामिल हैं। विन्यास फाइल दिखाई देता है StandardCharsets सहित 67 अमरूद deprecations, शामिल करने के लिए।
डेविड नोव

28

मैंने शुरू में इसका इस्तेमाल संग्रह शॉर्टहैंड के लिए किया था। उदाहरण के लिए, इसके बजाय:

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();

तुम यह केर सकते हो:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();

मानचित्रों को आबाद करना भी आसान है:

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");

अब, मैंने अमरूद में मौजूद कुछ अन्य उपयोगी उपयोगिताओं की खोज की है। उदाहरण के लिए, CharMatcher वर्ग आपको वर्णों के अनुक्रमों का मिलान करने की अनुमति देता है। तुम कर सकते हो:

CharMatcher.inRange('a','z').or(inRange('A','Z'));

या

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");

21

CharMatcher के पूर्व-निर्मित () विधि ( स्रोत ) एक अच्छी "छिपी हुई विशेषता" है जिसे मैंने दूसरे दिन ठोकर खाई थी।

यह वास्तव में सिर्फ एक अनुकूलन है, जो लुकअप टेबल (थोड़ी सरणी का उपयोग करके) बनाता है, और फिर वर्णों को देखने के लिए देखता है कि क्या वे "मैच" करते हैं।

जब आप किसी लाइब्रेरी का उपयोग करते हैं, तो यह उस तरह का छिपा हुआ अनुकूलन होता है, जिसका आप लाभ उठा सकते हैं, जो आपने स्वयं अपने कोड में नहीं सोचा होगा।

बेशक, यदि आप एक जटिल चारमैचर बनाते हैं, जिसे आप कई बार उपयोग करने की योजना बनाते हैं, तो आपको प्रीकोम्प्यूटेड () विधि को कॉल करना याद रखना चाहिए, जैसे:

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();

मेरा भी अमरूद सुने जाने योग्य पर सवाल है । यदि संभव हो तो आप मेरे डिजाइन की समीक्षा कर सकते हैं और मुझे अपने कुछ संदेह को स्पष्ट करने में मदद कर सकते हैं और मुझे उनसे कैसे निपटना चाहिए? मैंने हाल ही में अमरूद सुने जाने योग्य सीवन के साथ काम करना शुरू किया और मुझे बहुत पसंद है लेकिन इनका कुशलता से उपयोग करने के बारे में कुछ भ्रम है।
जॉन

16

यहां Google से एक YouTube वीडियो (स्पीकर: केविन बॉरिलिन, Google के कोर जावा पुस्तकालयों के लिए प्रमुख इंजीनियर) है जो Google संग्रह की सुंदरता दिखाता है। Google ने एक काम किया, जो मुझे विश्वास है कि शानदार है, संग्रह में अपरिवर्तनीयता की गारंटी है


12

Google अमरूद एक उपयोगिता पुस्तकालय है, इसलिए मुझे संदेह है कि इसके अंदर एक हत्यारा वर्ग है। उपयोगिता के बारे में पूरी बातें आप लगभग हर परियोजना में उपयोग करते हैं। मुझे ऐसा कोई प्रोजेक्ट याद नहीं आ रहा है जो मैंने किया हो जो जावा संग्रह का उपयोग नहीं करता हो। और सच्चाई यह है कि, Google अमरूद की संग्रह उपयोगिता अद्भुत है और जावा एसडीके में ही होनी चाहिए।

मैंने Google Guava पर कक्षाओं के बारे में तीन लेख लिखे हैं:

और यह सब नहीं है, कई अन्य चीजें हैं जो आप अमरूद के साथ कर सकते हैं।


8

बिल्कुल सुपर उपयोगी। यह लगभग हमेशा एक नई परियोजना में जोड़ा गया पहला पुस्तकालय है।

  1. हम Iterators / Iterables और फ़ंक्शन इंटरफ़ेस के बहुत शौकीन हैं।
  2. इंटरफेस के सेवा परिवार महान सार हैं
  3. हम इतने प्रतिबद्ध हैं कि हमने अपने API प्रकारों को ImmutableXXX कक्षाओं का उपयोग करना शुरू कर दिया है ताकि यह सूचित किया जा सके कि इसे बदला नहीं जा सकता है।
  4. कुछ स्थितियों में कम्प्यूटिंग मैप्स (मैपमेकर से) अद्भुत हैं।

कुल मिलाकर, पुस्तकालय बहुत उच्च गुणवत्ता वाला है। एपीआई अच्छी तरह से सोचा है, कार्यान्वयन ठोस। अत्यधिक सिफारिशित।


7

मैपमेकर अब बाउंडेड LRU कैश प्रदान करता है - यह एक छोटे एपीआई के पीछे छिपी कुछ महत्वपूर्ण मशीनरी है। यह विशाल उपयोगिता के लिए क्षमता है, और मैं अभी भी सभी कोड में हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.