我发现MSVC和GCC编译器每个类实例至少分配一个字节,即使该类是没有成员变量的谓词(或只有静态成员变量).以下代码说明了这一点.
#include <iostream>
class A
{
public:
bool operator()(int x) const
{
return x>0;
}
};
class B
{
public:
static int v;
static bool check(int x)
{
return x>0;
}
};
int B::v = 0;
void test()
{
A a;
B b;
std::cout << "sizeof(A)=" << sizeof(A) << "\n"
<< "sizeof(a)=" << sizeof(a) << "\n"
<< "sizeof(B)=" << sizeof(B) << "\n"
<< "sizeof(b)=" << sizeof(b) << "\n";
}
int main()
{
test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof(A)=1
sizeof(a)=1
sizeof(B)=1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试让Selenium等待页面加载后动态添加到DOM的元素.试过这个:
fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,这里是fluentWait:
FluentWait fluentWait = new FluentWait<>(webDriver) {
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(200, TimeUnit.MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)
但它会抛出NoSuchElementException- 看起来像presenceOfElement期望元素存在,所以这是有缺陷的.这对于Selenium来说一定是面包和黄油,并且不想重新发明轮子......任何人都可以建议一个替代品,理想情况下不要自己动手Predicate吗?
如何将多个谓词应用于java.util.Stream's filter()方法?
这就是我现在所做的,但我并不喜欢它.我有一些Collection东西,我需要根据Collection过滤器(谓词)减少事物的数量:
Collection<Thing> things = someGenerator.someMethod();
List<Thing> filtered = things.parallelStream().filter(p -> {
for (Filter f : filtersCollection) {
if (f.test(p))
return true;
}
return false;
}).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我知道如果我事先了解过滤器的数量,我可以这样做:
List<Thing> filtered = things.parallelStream().filter(filter1).or(filter2).or(filter3)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是如何在不混合编程风格的情况下应用未知数量的谓词?知道它看起来有点难看......
我有一个接受Expression<Func<T, bool>>一个参数的方法.我想在List.Find()方法中将它用作谓词,但我似乎无法将其转换为List所采用的谓词.你知道一个简单的方法吗?
public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
var list = GetList<T>();
var predicate = [what goes here to convert expression?];
return list.Find(predicate);
}
Run Code Online (Sandbox Code Playgroud)
更新
结合tvanfosson和280Z28的答案,我现在使用这个:
public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
var list = GetList<T>();
return list.Where(expression.Compile()).ToList();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个复杂的xpath表达式,它将回答以下条件.
从下面的XML数据中,返回User实体,其中:
他有2个不同的配置文件值,分别是" operator "和" admin "(我不知道前面的确切顺序)
<user>
<login>user1</login>
<name>User 1</name>
<profile>
<value>admin</value>
<id>2</id>
<description>admin users</description>
</profile>
<profile>
<value>operator</value>
<id>1</id>
<description>Operator</description>
</profile>
</user>
<user>
<login>user2</login>
<name>User 2</name>
<profile>
<value>admin</value>
<id>4</id>
<description>admins users</description>
</profile>
<profile>
<value>poweruser</value>
<id>5</id>
<description>power users</description>
</profile>
</user>
</root>
Run Code Online (Sandbox Code Playgroud)有人可以为这种情况提供一个例子吗?
编辑:添加了复杂的配置文件实体
这是一个noob问题 - 我仍然是C#和泛型的新手,对谓词,委托和lambda表达式来说是全新的......
我有一个"查询"课程,其中包含另一个名为"车辆"的课程的通用列表.我正在构建代码以从父查询添加/编辑/删除车辆.而目前,我特别关注删除.
从我到目前为止所看到的,似乎我可以使用Vehicles.RemoveAll()来删除具有特定VehicleID的项目或具有特定EnquiryID的所有项目.我的问题是理解如何提供.删除所有正确的谓词 - 我看到的例子过于简单化(或者由于我对谓词,委托和lambda表达式缺乏了解,我可能过于简单化).
因此,如果我有一辆List<Of Vehicle> Vehicles车在哪里有一个EnquiryID,我将如何使用Vehicles.RemoveAll()移除给定EnquiryID的所有车辆?
我知道有几种方法,所以我很想听到方法之间的差异 - 尽管我需要一些工作,这也是一个学习练习.
作为补充问题,通用列表是这些对象的最佳存储库吗?我的第一个倾向是收藏品,但看起来我已经过时了.当然,仿制药似乎更受欢迎,但我对其他替代品感到好奇.
我使用获取请求和谓词从Core Data持久性存储中获取一组对象.我当前的谓词只是检查属性是否> =某个值.这一切都很好,除了我想最终排除当前在数组中保存的任何对象.
我基本上需要能够排除一组对象,我认为我能做到这一点的唯一方法是能够objectID从我的托管对象数组中获取一个列表,并在我的谓词中创建另一个表达式以确保任何对象返回不一样objectID.IE @"ANY records.objectID NOT IN %@", arrayOfObjectID.
我怎样才能做到这一点?
如果我编写Predicate接口,我想在接口中编码它只是一个返回原始布尔值的函数,如下所示:
@FunctionalInterface
public interface Predicate<T> extends Function<T, Boolean> {
boolean test(T t);
@Override
default Boolean apply(T t) {
return Boolean.valueOf(test(t));
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道,有没有令人信服的理由让Java 8 API设计者选择将Predicate与Function完全分开?是否有一些证据表明他们认为这样做并决定反对呢?我想类似的问题适用于所有其他'特殊'功能接口,如Consumer(可能是Function <T,Void>),Supplier(Function <Void,T>)和原始函数,如IntFunction(Function <Integer,T>).
我没有深入和彻底地考虑过这个问题的所有后果,所以我可能会遗漏一些东西.
编辑:一些答案强调了应用和测试之间的语义区别.我不是说我不欣赏这种区别,我同意这种区别是有益的.我不明白的是,为什么Predicate不是一个函数,就像List是一个Collection或Double是一个Number,它是一个Object.
如果Predicate(以及所有其他特殊的通用功能接口,例如Consumer,Supplier,IntUnaryOperator等)与Function有这种关系,它将允许人们在预期使用Function参数的地方使用它(想到的是组合与其他功能,例如,呼叫myFunction.compose(比如说myPredicate)或避免在API中写入几个专门的功能时,如上所述的这种汽车(未)拳击实施将是足够的)
编辑2:看看openjdk lambda项目,我发现原始的功能接口用于扩展功能,直到2012-12-19的Brian Goetz提交.我找不到具体的原因,在那个时候对任何lambda-dev或JSR专家组邮件列表进行了更改.
我正在尝试学习lisp,使用emacs方言,我有一个问题.让我们说list有一些成员,谓词的评估结果为false.如何在没有这些成员的情况下创建新列表?类似的东西{ A in L: p(A) is true }.在python中有过滤函数,在lisp中是否有相同的东西?如果没有,我该怎么办?
谢谢