ห้องสมุด Guava: อะไรคือคุณสมบัติที่มีประโยชน์ที่สุดและ / หรือซ่อนอยู่? [ปิด]


131

ฉันได้สแกนGuava APIอย่างรวดเร็วและประเภทคอลเลคชันใหม่ที่มีให้ ( MultimapและBiMapดูเหมือนว่ามีประโยชน์) และฉันกำลังคิดว่าจะรวมไลบรารีไว้ในโครงการที่ฉันทำงานอยู่

อย่างไรก็ตามฉันยังมีความจำเป็นที่จะรวมห้องสมุดไว้ด้วยความเต็มใจหากไม่มีประโยชน์อย่างยิ่งและการเรียนรู้คุณลักษณะนี้ทำให้เสียเวลาอันมีค่า

คุณได้รวมไลบรารี Guava ไว้ในโครงการของคุณและได้รับการพิสูจน์แล้วว่ามีประโยชน์ในทางที่ไม่คาดคิดหรือไม่? คุณจะใช้มันในอนาคตหรือไม่? ประโยชน์หลัก / ประหยัดเวลาคืออะไร? คุณสมบัติที่ซ่อนอยู่คืออะไร?


4
ชื่อและคำถามของคุณไม่ตรงกัน
aioobe

4
"ประเภทคอลเลกชันใหม่ ... ดูเหมือนมีประโยชน์" และ "ฉันมีความจำใจที่จะรวมห้องสมุด ... หากพวกเขาไม่มีประโยชน์อย่างยิ่ง" - แล้วจะเป็นอย่างไร คุณคิดว่าห้องสมุดมีประโยชน์และมีประโยชน์หรือไม่
แมตต์ข

1
ณ ปี 2017 (ปิดคำถามแล้ว) หากคุณใช้ Gradle (4.4.1) guava 21.0 ล่าสุดจะถูกเพิ่มลงใน build.gradle โดยค่าเริ่มต้นเป็นการอ้างอิงโดยมีคำว่า "การพึ่งพานี้ใช้ภายในและไม่เปิดเผยต่อผู้บริโภค ใน classpath คอมไพล์ของตัวเอง "ซึ่งบ่งบอกว่าทีม Gradle ได้ตัดสินใจว่ามีของที่มีค่าอยู่ในนั้น
หนูไมค์

คำตอบ:


158

อย่างจริงจังทุกอย่างใน Guava มีประโยชน์ ฉันใช้มันมาระยะหนึ่งแล้วและฉันก็ยังคงค้นพบสิ่งใหม่ ๆ ที่ฉันทำได้โดยใช้รหัสน้อยกว่าการทำด้วยมือ

บางสิ่งที่คนอื่นไม่ได้พูดถึงว่าฉันชอบ:

  • Multimaps นั้นยอดเยี่ยมมาก เมื่อใดก็ตามที่คุณต้องการใช้สิ่งที่ต้องการMap<Foo, Collection<Bar>>ให้ใช้แผนที่หลายแผนที่แทนและช่วยตัวคุณเองในการตรวจสอบคอลเลกชันที่มีอยู่ซึ่งแมปกับคีย์และสร้างและเพิ่มหากไม่มี
  • Orderingเหมาะสำหรับการสร้างComparatorที่มีพฤติกรรมตามที่คุณต้องการ
  • Maps.uniqueIndexและMultimaps.index: วิธีการเหล่านี้ใช้เวลาIterableและ a Functionและสร้างImmutableMapหรือสร้างImmutableListMultimapดัชนีค่าIterableตามผลลัพธ์ของการใช้ฟังก์ชันกับแต่ละฟังก์ชัน ดังนั้นด้วยฟังก์ชันที่ดึง ID ของรายการคุณสามารถจัดทำดัชนีรายการตาม ID ได้ในบรรทัดเดียว
  • สิ่งที่ทำงานก็มี ... filter, transformฯลฯ แม้จะฟุ่มเฟื่อยของการใช้ชั้นเรียนสำหรับการFunctionและPredicates ฉันได้พบที่มีประโยชน์นี้ ฉันให้ตัวอย่างของวิธีหนึ่งที่จะทำให้การอ่านอย่างนี้นี่
  • ComparisonChainเป็นคลาสขนาดเล็กที่มองข้ามได้ง่ายซึ่งมีประโยชน์เมื่อคุณต้องการเขียนวิธีการเปรียบเทียบที่เปรียบเทียบค่าหลายค่าต่อเนื่องกันและควรส่งคืนเมื่อพบความแตกต่างแรก มันจะลบความน่าเบื่อหน่ายทั้งหมดออกไปทำให้มันเป็นเพียงการเรียกเมธอดที่ถูกล่ามโซ่เพียงไม่กี่บรรทัด
  • Objects.equal(Object,Object) - ค่าว่างเท่ากับ
  • Objects.hashCode(Object...) - วิธีง่ายๆในการรับรหัสแฮชจากหลายสาขาในชั้นเรียนของคุณ
  • Objects.firstNonNull(Object,Object) - ลดรหัสสำหรับการรับค่าเริ่มต้นหากค่าแรกเป็นค่าว่างโดยเฉพาะอย่างยิ่งถ้าค่าแรกเป็นผลลัพธ์ของการเรียกใช้เมธอด (คุณต้องกำหนดให้กับตัวแปรก่อนที่จะดำเนินการตามปกติ)
  • CharMatcherมีการกล่าวถึงไปแล้ว แต่มันทรงพลังมาก
  • Throwablesช่วยให้คุณสามารถทำสิ่งที่ดีได้ด้วยสิ่งThrowables.propagateที่ขว้างปาได้เช่นซึ่งจะนำกลับมาใช้ใหม่ได้หากเป็นRuntimeExceptionหรือเป็นErrorและรวมเข้าด้วยกันRuntimeExceptionและโยนสิ่งนั้นออกไป

ฉันสามารถไปต่อได้อย่างแน่นอน แต่ฉันต้องไปทำงาน =) อย่างไรก็ตามแม้ว่าฉันจะระบุบางสิ่งที่ฉันชอบที่นี่ แต่ความจริงก็คือทุกอย่างใน Guava มีประโยชน์ในบางสถานการณ์หรืออย่างอื่น ส่วนใหญ่มีประโยชน์บ่อยมาก เมื่อคุณใช้งานคุณจะค้นพบการใช้งานมากขึ้น ไม่ใช้มันจะรู้สึกเหมือนมีมือข้างหนึ่งมัดไพล่หลัง


2
ComparisionChainทั้งหมดเห็นด้วยกับ
วิสกี้เซี

44

ฉันใช้ Guava อย่างมีประสิทธิภาพมาสองสามปีแล้วใน Google และมันยอดเยี่ยมมาก

ส่วนฉันโดยเฉพาะอย่างยิ่งรักคือ:

  • Charsets.* - ง่ายมากมีประโยชน์มาก
  • คอลเลกชัน
  • การจัดการ IO (อ่านทรัพยากรอย่างสมบูรณ์ในบรรทัดเดียว ฯลฯ )
  • Splitter/Joiner
  • Preconditions

6
โปรดทราบว่าตอนนี้เรามีStandardCharsetsใน Java 7+ ฉันสงสัยว่าฟีเจอร์อื่น ๆ ของ Guava เข้าสู่ Java ได้อย่างไร
DavidS

1
ฉันพบปลั๊กอิน Modernizer Mavenซึ่งตรวจพบการใช้ API แบบเดิมรวมถึงไลบรารีของบุคคลที่สามเช่น Guava แฟ้มการกำหนดค่าที่ดูเหมือนจะมี 67 deprecations ฝรั่งรวมทั้ง StandardCharsets
DavidS

28

ตอนแรกฉันใช้มันสำหรับคอลเลกชัน shorthands ตัวอย่างเช่นแทนที่จะเป็น:

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");

ตอนนี้ฉันได้ค้นพบยูทิลิตี้ที่มีประโยชน์อื่น ๆ ที่มีอยู่ใน Guava ตัวอย่างเช่นคลาสCharMatcherช่วยให้คุณจับคู่ลำดับของอักขระ คุณทำได้:

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

หรือ

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

21

precomputed () method ( source ) ของ CharMatcherเป็น "คุณลักษณะที่ซ่อนอยู่" ที่ดีที่ฉันสะดุดเมื่อวันก่อน

มันเป็นเพียงการเพิ่มประสิทธิภาพที่สร้างตารางการค้นหา (โดยใช้อาร์เรย์บิต) จากนั้นก็ค้นหาอักขระเพื่อดูว่า "ตรงกัน" หรือไม่

เป็นการเพิ่มประสิทธิภาพที่ซ่อนอยู่ซึ่งคุณสามารถใช้ประโยชน์ได้เมื่อคุณใช้ไลบรารีซึ่งคุณอาจไม่ได้คิดว่าตัวเองเป็นโค้ดของคุณเอง

แน่นอนว่าหากคุณสร้าง CharMatcher ที่ซับซ้อนซึ่งคุณวางแผนจะใช้หลาย ๆ ครั้งคุณต้องจำไว้ว่าให้เรียกใช้เมธอด precomputed () เช่น:

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

ฉันยังมีคำถามเกี่ยวกับฝรั่งListenableFuture หากเป็นไปได้คุณสามารถตรวจสอบการออกแบบของฉันและช่วยฉันชี้แจงข้อสงสัยของฉันและฉันควรจัดการกับมันอย่างไร ฉันเพิ่งเริ่มทำงานกับ Guava ListenableFuture และฉันชอบมาก แต่มีความสับสนเกี่ยวกับวิธีใช้อย่างมีประสิทธิภาพ
ห์น

16

นี่คือวิดีโอ YouTubeจาก Google (ผู้บรรยาย: Kevin Bourrillion หัวหน้าวิศวกรของไลบรารี Java หลักของ Google) ซึ่งแสดงให้เห็นถึงความสวยงามของ Google Collections สิ่งหนึ่งที่ Google ทำซึ่งฉันเชื่อว่ายอดเยี่ยมคือการรับประกันความไม่เปลี่ยนแปลงในคอลเล็กชัน


12

Google Guava เป็นไลบรารียูทิลิตี้ดังนั้นฉันจึงสงสัยว่ามีคลาสนักฆ่าอยู่ข้างใน สิ่งทั้งหมดเกี่ยวกับยูทิลิตี้คือคุณเกือบจะใช้สิ่งนั้นในทุกโครงการที่คุณมี ฉันจำโปรเจ็กต์ที่ทำที่ไม่ได้ใช้คอลเลกชัน Java ไม่ได้ และความจริงก็คือยูทิลิตี้คอลเลกชันของ Google Guava นั้นยอดเยี่ยมและควรอยู่ใน Java SDK เอง

ฉันเขียนบทความเกี่ยวกับชั้นเรียนใน Google Guava ไปสามบทความ:

และยังไม่หมดแค่นี้ยังมีสิ่งอื่น ๆ อีกมากมายที่คุณสามารถทำกับฝรั่งได้


8

มีประโยชน์สุด ๆ อย่างแน่นอน แทบจะเป็นไลบรารีแรกที่เพิ่มในโปรเจ็กต์ใหม่

  1. เราชอบ Iterators / Iterables และอินเทอร์เฟซฟังก์ชันมาก
  2. กลุ่มอินเทอร์เฟซของบริการเป็นสิ่งที่ยอดเยี่ยม
  3. เรามีความมุ่งมั่นอย่างมากที่ได้เริ่มใช้คลาส ImmutableXXX ประเภท API ของเราเพื่อสื่อสารว่าไม่สามารถเปลี่ยนแปลงได้
  4. แผนที่คอมพิวเตอร์ (จาก MapMaker) นั้นยอดเยี่ยมในบางสถานการณ์

โดยรวมแล้วห้องสมุดมีคุณภาพสูงมาก API ได้รับการพิจารณาอย่างดีการใช้งานที่มั่นคง แนะนำเป็นอย่างยิ่ง


7

ขณะนี้ MapMaker นำเสนอแคช LRU ที่มีขอบเขตซึ่งนั่นคือเครื่องจักรจำนวนมากที่ซ่อนอยู่หลัง API ขนาดเล็ก สิ่งนี้มีศักยภาพสำหรับยูทิลิตี้ขนาดใหญ่และฉันยังคงใช้รหัสทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.