2014-05-10 18 views
0

我現在有網站的列表對象作爲我的地盤值對象:測試在列表中的Java

List<Site> sites = new LinkedList(); 

網站是由:

String url; 
String id; 
Host host; 

我想寫一個方法測試以查看我網站中的任何「網站」值是否包含網址字符串或ID字符串。

我不能使用包含這個方法,因爲我不關心主機值。

有沒有一種更簡單的方法通過集合來做到這一點,除了寫一樣的東西:

public boolean checkValues(String url, String id) { 
    for (Site : this.sites) { 
      // Check if the url, id is in the site 
} 
+0

我不認爲有一個更簡單的方法,至少要等到8的Java,用lambda表達式 –

回答

2

沒有沒有在數據庫的任何這樣的方法呢。我不確定是否有任何第三方解決方案。

可替換地,下文中可以做(如果ofcourse USECASE許可證)

public class Site { 
    String url; 
    String id; 
    String host; 

    boolean contains(String str) { 
     if(url.contains(str) || id.contains(str)) return true; 
     return false; 
    } 
} 

=====================

for (Site site : sites) { 
    if(site.contains(s)) { 
//TODO 
    } 
} 
+1

......也許不是在Java 7的......但在Java 8 ... – Makoto

1

使用番石榴收集過濾謂詞

Iterable<Person> filtered = Iterables.filter(allPersons, new Predicate<Person>() { 
    @Override 
    public boolean apply(Person p) { 
     return acceptedNames.contains(p.getName()); 
    } 
}); 

有同樣的問題:Filtering a list of JavaBeans with Google Guava

1

您可以使用Guava(如另一個答案中所解釋的)或Java 8中的本地語言來執行此操作。這使用lambda函數和一個Stream對象。

假設我們只關心包含字符串4的ID或包含字符串6的URL。下面介紹一種方法。

這是比較詳細的方法,結合了Java 8 lambda和old-school迭代。

final Stream<Site> filter = 
     siteList.stream().filter(site -> site.getId().contains("4") || site.getUrl().contains("6")); 
for(Iterator<Site> filterIter = filter.iterator(); filterIter.hasNext();) { 
    Site next = filterIter.next(); 
    System.out.println(next); 
} 

這裏有一個更簡潔的方式,使用forEachConsumer

siteList.stream().filter(
    site -> site.getId().contains("4") || 
    site.getUrl().contains("6")).forEach((site) -> System.out.println(site)); 

這裏是最簡潔的方法,使用System.out::println方法參考。

siteList.stream().filter(
     site -> site.getId().contains("4") || 
       site.getUrl().contains("6")) 
       .forEach(System.out::println);