在以下代码的ContainsIngredients方法中,是否可以缓存p.Ingredients值而不是多次显式引用它?这是我刚熟了用于说明目的相当简单的例子,但我工作的引用代码值深处p如.p.InnerObject.ExpensiveMethod().值
编辑:我正在使用来自http://www.albahari.com/nutshell/predicatebuilder.html的PredicateBuilder
public class IngredientBag
{
private readonly Dictionary<string, string> _ingredients = new Dictionary<string, string>();
public void Add(string type, string name)
{
_ingredients.Add(type, name);
}
public string Get(string type)
{
return _ingredients[type];
}
public bool Contains(string type)
{
return _ingredients.ContainsKey(type);
}
}
public class Potion
{
public IngredientBag Ingredients { get; private set;}
public string Name {get; private set;}
public Potion(string name) : this(name, null)
{
}
public Potion(string name, IngredientBag ingredients)
{ …Run Code Online (Sandbox Code Playgroud) 我- (NSFetchedResultsController *)fetchedResultsController从CoreDataBook示例开始以标准方式使用谓词.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"state=%@ && date >= %@ && date < %@", @"1",fromDate,toDate];
[fetchRequest setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)
这工作正常但是在编辑项目时,它返回NSFetchedResultsChangeDelete而不是Update.当主视图返回时,它缺少该项.如果我重新启动模拟器,则不会保存删除并显示正确的编辑结果,谓词正常工作.
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
Run Code Online (Sandbox Code Playgroud)
我可以通过仅注释两个谓词行来确认行为,然后全部工作,因为它应该在编辑和调用NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete后正确返回完整集.
我已经阅读了http://matteocaldari.it/2009/11/multiple-contexts-controllers-delegates-and-coredata-bug ,他们报告了类似的行为,但我还没有找到解决问题的方法.
我正在使用下面的代码使用符合搜索条件的CoreData获取所有行的查询集:itemType = 1.但我需要做的是从数据中获取特定数量的Random行.例如,我不需要检索列名为dataType = 1的所有100行数据,而是需要随机获取25行dataType = 1.我希望有相对无痛的解决方案.任何帮助表示赞赏.LQ
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MyAppName"
inManagedObjectContext:[self managedObjectContext]]];
NSError *error = nil;
NSPredicate *predicate;
NSArray *fetchResults;
predicate = [NSPredicate predicateWithFormat:@"(itemType = %i)", 1];
[request setPredicate:predicate];
fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
if (!fetchResults) {
// NSLog(@"no fetch results error %@", error);
}
self.mutableArrayName = [NSMutableArray arrayWithArray:fetchResults];
[request release];
Run Code Online (Sandbox Code Playgroud) 我正在使用PredicateBuilder创建一个动态Where子句来查询DataTable中的数据.我有一个包含我需要搜索的列名和值的字典.我只是迭代字典,如果键匹配列名,则将该键和值添加到谓词.一切似乎工作正常,直到对数据表运行实际查询,我得到零记录:(但如果我用p => p ["年"] =="2010"之类的东西替换动态谓词,我得到记录回来.这是代码:
var objectList = table.AsEnumerable();
Func<DataRow, bool> predicate = GetPredicate(parms, table.Columns);
var list1 = objectList.Where(predicate).ToList();
private static Func<DataRow, bool> GetPredicate(Dictionary <string, string> parms, DataColumnCollection dataColumnCollection)
{
var predicate = PredicateBuilder.False<DataRow>();
foreach (var parm in parms)
{
if (dataColumnCollection.Contains(parm.Key))
{
var copy = parm;
predicate = predicate.And(p => p[copy.Key] == copy.Value);
}
}
return predicate.Compile();
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激:)
有人能告诉我以下3个查找选项之间的差异/优势:
List<Employee> Employees = new List<Employee>();
Employee tmp = new Employee();
tmp.FirstName = "Randy";
tmp.LastName = "Jones";
Employees.Add(tmp);
tmp.FirstName = "David";
tmp.LastName = "Smith";
Employees.Add(tmp);
tmp.FirstName = "Michele";
tmp.LastName = "Morris";
Employees.Add(tmp);
// Find option 1
Employee eFound1= Employees.Find((Employee emp1) => {return emp1.LastName == "Jones";});
// Find option 2
Employee eFound2 = Employees.Find(emp2 => emp2.LastName == "Smith");
// Find option 3
Employee eFound3 = Employees.Find(
delegate(Employee emp3)
{
return emp3.LastName == "Morris";
}
);
Run Code Online (Sandbox Code Playgroud)
我一直在阅读有关lambdas和谓词的内容(我怀疑它与答案有某种联系),但我不能把它们放在一起.任何启示将不胜感激!
谢谢大卫
我有两节课:
ClassA {
public String methodA(String accountId, Predicate<User> predicate) {
// more code
};
}
ClassB {
methodB(){
ClassA objectA = new ClassA();
objectA.methodA("some id", PredicatesProvider.isUserValid());
// more code ...
}
}
class PredicatesProvider {
static Predicate<User> isUserValid(){
return (user) -> {
return user.isValid();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我需要模拟ClassA,所以我使用Mockito的模拟方法,如下所示:
ClassA mockObjectA = Mockito.mock(ClassA.class);
Mockito.when(mockObjectA).methodA("some id", PredicatesProvider.isUserValid()).thenReturn("something");
Run Code Online (Sandbox Code Playgroud)
Mockito无法找到签名匹配.
The java.lang.AssertionError: expected:<PredicatesProvider$$Lambda$5/18242360@815b41f> but was:<PredicatesProvider$$Lambda$5/18242360@5542c4ed>
Run Code Online (Sandbox Code Playgroud)
这是我想要实现的简化版本.我猜这是谓词的equals()函数的问题.知道如何模拟具有谓词参数的方法吗?
谢谢
最近,我一直在使用谓词和番石榴实用程序.我创建了一个Utils.class,我存储了一些我在代码的不同部分使用的谓词.因此,这个问题已经出现,我们(我和我的同事)没有就此达成一致.
将谓词放在实用程序类中的正确方法或"良好实践方式"是什么?作为用大写字母或静态方法定义它的常量?接下来,我写一个例子:
public final class Utils {
public static final Predicate<Element> IS_SPECIAL = new Predicate<Element>() {
@Override
public boolean apply(Element elem) {
return elem.special;
}
};
public static Predicate<Element> isSpecial() {
return new Predicate<Element>() {
@Override
public boolean apply(Element elem) {
return elem.special;
}}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,番石榴提供了一些预测谓词,它提供了一个返回谓词的方法,但其他的libreries也提供它们作为常量.
我有一些看起来像这样的东西:
public boolean isValidObject(SomeObject obj){
if(obj.getField() == null){
LOG.error("error code 1");
return false;
}
if(obj.getField().getSize() > 500){
LOG.error("error code 2");
return false;
}
......
if(someCondition()){
log something
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
用lambdas在java 8中编写这个最干净的方法是什么?
如果没有传递谓词,如何将谓词传递给方法,又如何使谓词起作用?我以为也许是这样,但这似乎并不正确。
private bool NoFilter() { return true; }
private List<thing> GetItems(Predicate<thing> filter = new Predicate<thing>(NoFilter))
{
return rawList.Where(filter).ToList();
}
Run Code Online (Sandbox Code Playgroud)