【问题标题】:Testing for value in a list java测试列表java中的值
【发布时间】:2014-05-10 05:04:21
【问题描述】:

我目前有一个 Site 对象列表作为我的 Sites 对象:

List<Site> sites = new LinkedList();

网站由:

String url;
String id;
Host host;

我想编写一个方法来测试我的站点中的任何“站点”值是否包含 url 字符串或 id 字符串。

我不能为此使用 contains 方法,因为我不关心主机值。

除了写这样的东西之外,还有没有更简单的方法可以通过 Collections 做到这一点:

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

【问题讨论】:

  • 我认为没有更简单的方法,至少在 Java 8 之前,使用 lambda 表达式

标签: java


【解决方案1】:

不,Collections 中还没有任何这样的方法。我不确定是否有任何第三方解决方案。

或者,可以执行以下操作(当然如果用例允许)

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
    }
}

【讨论】:

    【解决方案2】:

    使用 Guava 集合过滤谓词

    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

    【讨论】:

      【解决方案3】:

      您可以使用 Guava(如另一个答案中所述)或本机在 Java 8 中执行此操作。这使用 lambda 函数和 Stream 对象。

      假设我们只关心包含字符串 4 的 ID 或包含字符串 6 的 URL。这是解决此问题的一种方法。

      这是更冗长的方法,结合了 Java 8 lambda 和老式迭代。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多