簡體   English   中英

Guava Collections-按字符串值數組過濾

[英]Guava Collections - filter by array of String values

我有一個事件對象列表。 每個對象都公開getId() getter。 我需要過濾集合以僅獲取具有特定ID的項目,我可以這樣進行:

Lists.newArrayList(Iterables.filter(ret, x->x.getCategoryId().equals(category)));

結果,我得到了新的數組,過濾為項,其中getCategoryId()等於我的特定category

到目前為止很好。 問題:如果我有一個String值數組(所有類別用作過濾器),而不是單個特定類別,該怎么辦? 可能如下所示:

Lists.newArrayList(Iterables.filter(ret, x->x.getCategoryId().equals(categories.get(0)) || x.getCategoryId().equals(categories.get(1)) || ......../*To the end of the list*/));

由於我的categories列表是動態的,因此我需要使用動態查詢來獲取所有|| 應用的條件。 最好的方法是什么? 我可以以某種方式循環它還是提供數組作為filter方法的標准?

注意:我使用的是Android,因此:

  • 可以使用Java 8 lambda(如您在上面看到的)來簡化語法。
  • 無法使用Java 8流(因為min api是Android Lollipop)。 這就是為什么使用番石榴來執行過濾的原因。 請不要提出任何基於Java 8流的建議。

那么,你有什么主意嗎?

您所需要做的就是構建一個guava Predicate ,因為您需要快速查找,所以首先從該數組構建Set可能會有所回報:

Set<String> set = new HashSet<>(Arrays.asList(values));   

而不是簡單地替換謂詞:

x -> set.contains(x.getCategoryId())

僅使用Java 8,您將執行以下操作:

final Set<String> categories = new HashSet<>(Arrays.asList("category 1", "category 2"));
ret.stream()
   .filter(x -> categories.contains(x.getCategoryId()))
   .collect(Collectors.toList());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM