使用Google Guava API过滤

时间:2015-04-26 09:14:20

标签: java guava

有没有办法检查列表中的所有对象是否与Google Guava API具有相同的属性?

此外,有没有办法向Predicate发送更多参数?

让我说我想用我从用户那里得到的字符串过滤掉所有对象, 我希望Predicate在应用过滤器时使用此参数。

2 个答案:

答案 0 :(得分:2)

您可以按如下方式创建自己的谓词:

interface IMyScheduler
{
    void Every(TimeSpan interval, Action action);
}

//your real implementation
class MySheduler: IMyScheduler
{
    readonly Schedule _schedule;

    public MySheduler(Schedule schedule)
    {
        _schedule = schedule;
    }

    public void Every(TimeSpan interval, Action action)
    {
        _schedule.Every(TimeSpan.FromSeconds(5), () => { });
    }
}

//fake for the testing
class FakeSheduler: IMyScheduler
{
    public bool WasCalled { get; set; }

    public void Every(TimeSpan interval, Action action)
    {
        WasCalled = true;
    }
}

然后您可以执行以下操作进行过滤:

class MyPredicate implements Predicate<MyObject> {
  private final String parameter;

  public MyPredicate(String parameter) {this.parameter = parameter;}

  boolean apply(MyObject input) {
  // apply predicate using parameter.
  }
}

你应该小心,但这会执行一个惰性过滤器。

答案 1 :(得分:1)

  

有没有办法检查列表中的所有对象是否与Google Guava API具有相同的属性?

是:

Foo first = list.get(0).getFoo();
boolean allSameFoo = Iterables.all(list, element -> element.getFoo().equals(first));

或者,如果您还没有使用Java 8:

final Foo first = list.get(0).getFoo();
boolean allSameFoo = Iterables.all(list, new Predicate<Bar> {
    @Override
    public boolean apply(Bar element) {
        return element.getFoo().equals(first);
    }
});
  

有没有办法向Predicate发送更多参数

是:

String s = getFromUser();
Iterables.filter(list, element -> element.getFoo().equals(s));

或者,如果您还没有使用Java 8:

final String s = getFromUser();
Iterables.filter(list, new Predicate<Bar> {
    @Override
    public boolean apply(Bar element) {
        return element.getFoo().equals(s);
    }
});

您似乎并不真正了解内部类的工作原理,因此您应该阅读有关它们的教程:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html