Thư viện Guava: các tính năng hữu ích và / hoặc ẩn nhất của nó là gì? [đóng cửa]


131

Tôi đã quét nhanh Guava API và các loại bộ sưu tập mới mà nó cung cấp ( MultimapBiMapví dụ có vẻ hữu ích) và tôi đang nghĩ đến việc bao gồm thư viện trong (các) dự án mà tôi làm việc.

Tuy nhiên, tôi cũng có một sự thận trọng bao gồm các thư viện willy-nilly nếu chúng không có lợi ích lớn và việc học các tính năng làm lãng phí thời gian quý báu.

Bạn đã bao gồm thư viện Guava trong dự án của mình và nó có tỏ ra hữu ích theo bất kỳ cách bất ngờ nào không? Bạn sẽ luôn sử dụng nó trong tương lai? Điều gì đã được lợi ích chính / tiết kiệm thời gian của nó? Các tính năng ẩn của nó là gì?


4
Tiêu đề của bạn và câu hỏi của bạn không thực sự phù hợp.
aioobe

4
"Các loại bộ sưu tập mới ... có vẻ hữu ích" và "Tôi có một sự thận trọng để bao gồm các thư viện ... nếu chúng không có lợi ích lớn" - vậy thì đó là cái gì? bạn có thể nghĩ rằng thư viện là hữu ích và có lợi ích hoặc bạn không
matt b

Kể từ năm 2017 (câu hỏi hiện đã đóng), nếu bạn đang sử dụng ổi 21.0 mới nhất (4.4.1) được thêm vào build.gradle theo mặc định là một phụ thuộc, với dòng chữ "Sự phụ thuộc này được sử dụng trong nội bộ và không được tiếp xúc với người tiêu dùng trên đường dẫn biên dịch riêng của họ ", cho thấy nhóm Gradle đã quyết định có một số thứ thực sự có giá trị trong đó.
mike gặm nhấm

Câu trả lời:


158

Nghiêm túc mà nói, mọi thứ trong ổi đều hữu ích. Tôi đã sử dụng nó khá lâu và vẫn luôn khám phá ra một điều mới mà tôi có thể làm với nó mà tốn ít mã hơn là làm bằng tay.

Một số điều người khác chưa thực sự đề cập đến mà tôi yêu thích:

  • Multimaps chỉ là tuyệt vời. Bất cứ khi nào bạn sẽ sử dụng một cái gì đó như Map<Foo, Collection<Bar>>, thay vào đó hãy sử dụng một multimap và tiết kiệm cho mình rất nhiều kiểm tra tẻ nhạt cho một bộ sưu tập hiện có được ánh xạ tới một khóa và tạo và thêm nó nếu nó không có ở đó.
  • Orderinglà tuyệt vời để xây dựng Comparators mà hành xử theo cách bạn muốn.
  • Maps.uniqueIndexMultimaps.index: các phương thức này lấy một Iterablevà a Functionvà xây dựng một ImmutableMaphoặc ImmutableListMultimaplập chỉ mục các giá trị trong Iterablekết quả của việc áp dụng hàm cho từng phương thức. Vì vậy, với chức năng truy xuất ID của một mục, bạn có thể lập chỉ mục danh sách các mục theo ID của chúng trong một dòng.
  • Các công cụ chức năng mà nó cung cấp ... filter, transformv.v. Mặc dù có tính chi tiết khi sử dụng các lớp cho Functions và Predicates, tôi đã thấy điều này hữu ích. Tôi đưa ra một ví dụ về một cách để làm cho điều này đọc độc đáo ở đây .
  • ComparisonChainlà một lớp nhỏ, dễ bị bỏ qua, rất hữu ích khi bạn muốn viết một phương thức so sánh so sánh nhiều giá trị liên tiếp và sẽ trả về khi tìm thấy sự khác biệt đầu tiên. Nó loại bỏ tất cả sự tẻ nhạt của điều đó, làm cho nó chỉ là một vài dòng gọi phương thức được xâu chuỗi.
  • Objects.equal(Object,Object) - null an toàn bằng.
  • Objects.hashCode(Object...) - cách dễ dàng để có được mã băm dựa trên nhiều lĩnh vực của lớp bạn.
  • Objects.firstNonNull(Object,Object) - giảm mã để nhận giá trị mặc định nếu giá trị đầu tiên là null, đặc biệt nếu giá trị đầu tiên là kết quả của một cuộc gọi phương thức (bạn phải gán nó cho một biến trước khi thực hiện theo cách thông thường).
  • CharMatchers đã được đề cập, nhưng chúng rất mạnh mẽ.
  • Throwablescho phép bạn thực hiện một số điều tốt đẹp với các vật ném được, chẳng hạn như Throwables.propagatecó thể ném lại được nếu nó là một RuntimeExceptionhoặc một Errorvà bọc nó trong một RuntimeExceptionvà ném nó theo cách khác.

Tôi chắc chắn có thể tiếp tục, nhưng tôi phải đi làm. =) Dù sao, mặc dù tôi đã liệt kê một số điều tôi thích ở đây, nhưng thực tế là mọi thứ trong Guava đều hữu ích trong tình huống này hay tình huống khác. Phần lớn nó rất hữu ích. Khi bạn sử dụng nó, bạn sẽ khám phá ra nhiều cách sử dụng hơn. Không sử dụng nó sẽ cảm thấy hơi giống như có một tay bị trói sau lưng.


2
Hoàn toàn đồng ý về ComparisionChain.
whiskeyierra

44

Tôi đã sử dụng Guava một cách hiệu quả trong một vài năm, bên trong Google - và thật tuyệt vời.

Những phần tôi đặc biệt thích là:

  • Charsets.* - thật đơn giản, thật hữu ích
  • Bộ sưu tập
  • Xử lý IO (đọc tài nguyên hoàn toàn trong một dòng, v.v.)
  • Splitter/Joiner
  • Preconditions

6
Lưu ý rằng chúng tôi hiện có StandardCharsets trong Java 7+. Tôi tự hỏi có bao nhiêu tính năng khác của Guava đã tìm thấy đường vào Java.
DavidS

1
Tôi đã tìm thấy Plugin Maven Modernizer này phát hiện việc sử dụng các API kế thừa, bao gồm các thư viện của bên thứ ba như Guava. Tệp cấu hình dường như chứa 67 khấu hao ổi, bao gồm StandardCharsets.
DavidS

28

Tôi ban đầu sử dụng nó cho các bộ sưu tập tốc ký. Ví dụ: thay vì:

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

bạn có thể làm được việc này:

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

Cũng dễ dàng để tạo bản đồ:

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

Bây giờ, tôi đã phát hiện ra một số tiện ích hữu ích khác có trong Guava. Ví dụ, lớp CharMatcher cho phép bạn khớp các chuỗi ký tự. Bạn có thể làm:

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

hoặc là

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

21

Phương thức ( nguồn ) của CharMatcher là một "tính năng ẩn" tuyệt vời mà tôi tình cờ gặp vào một ngày khác.

Nó thực sự chỉ là một tối ưu hóa, tạo ra một bảng tra cứu (sử dụng một mảng bit), và sau đó chỉ cần tra cứu các ký tự để xem chúng có "khớp" hay không.

Đó là loại tối ưu hóa ẩn mà bạn có thể tận dụng khi bạn sử dụng thư viện, mà bạn có thể không nghĩ về chính mình trong mã của riêng bạn.

Tất nhiên, nếu bạn tạo một CharMatcher phức tạp, mà bạn dự định sử dụng nhiều lần, bạn phải nhớ gọi phương thức preomputing (), như:

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

Tôi cũng có câu hỏi về ổi ListenableFuture . Nếu có thể bạn có thể xem lại thiết kế của tôi và giúp tôi làm rõ một số nghi ngờ của tôi và làm thế nào tôi nên giải quyết chúng? Gần đây tôi đã bắt đầu làm việc với Guava ListenableFuture và tôi rất thích nhưng có một số nhầm lẫn về cách sử dụng chúng hiệu quả.
john

16

Đây là video YouTube từ Google (diễn giả: Kevin Bourrillion, kỹ sư trưởng của các thư viện Java cốt lõi của Google) cho thấy vẻ đẹp của Bộ sưu tập Google. Một điều mà Google đã làm, mà tôi tin là tuyệt vời, là đảm bảo Tính không thay đổi trong các bộ sưu tập.


12

Google Guava là một thư viện tiện ích, vì vậy tôi nghi ngờ rằng có một lớp sát thủ bên trong nó. Toàn bộ những gì về tiện ích là bạn gần như sử dụng nó trong mọi dự án bạn có. Tôi không thể nhớ bất kỳ dự án nào tôi đã thực hiện mà không sử dụng bộ sưu tập Java. Và sự thật là, tiện ích bộ sưu tập của Google Guava rất tuyệt vời và nên có trong chính SDK Java.

Tôi đã viết ba bài viết về các lớp học trên Google Guava:

Và đây không phải là tất cả, có nhiều thứ khác bạn có thể làm với ổi.


8

Hoàn toàn rất siêu hữu ích. Nó gần như luôn luôn là thư viện đầu tiên được thêm vào một dự án mới.

  1. Chúng tôi rất thích Iterators / Iterables và giao diện Function.
  2. Nhóm giao diện dịch vụ là sự trừu tượng tuyệt vời
  3. Chúng tôi rất cam kết, chúng tôi đã bắt đầu sử dụng các lớp ImmutableXXX các loại API của chúng tôi để thông báo rằng nó không thể thay đổi.
  4. Tính toán bản đồ (từ MapMaker) là tuyệt vời trong một số tình huống.

Nhìn chung, thư viện có chất lượng rất cao. API cũng được nghĩ ra, việc thực hiện vững chắc. Rất khuyến khích.


7

MapMaker hiện cung cấp bộ đệm LRU bị ràng buộc - đó là một số máy móc đáng kể ẩn sau một API nhỏ. Điều này có tiềm năng cho tiện ích khổng lồ và tôi vẫn còn toàn bộ mã.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.