我正在使用一个名为Predicate的接口,用于筛选集合.例如,我可以定义
public class BlackCatPredicate implements Predicate<Cat> {
public boolean evaluate( Cat c ) {
return c.isBlack();
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用一些实用工具findAll( Collection<T> coll, Predicate<T> pred)方法将谓词应用于Cats的集合,并获得黑色的等等.
我的问题是:我在我的代码中找到黑猫,所以没有必要一遍又一遍地实例化BlackCatPredicate.它应该只有一个实例.(单身?)但是,在编写许多谓词的过程中,我不想将每个谓词都作为单例来实现.那么 - 这里的设计是什么?
我不明白以下代码是如何工作的.具体来说,我不明白使用"return i <3".我希望返回i如果它<小于3.我总是认为返回只返回值.我甚至找不到它的语法.
第二个问题,在我看来,使用匿名方法(委托(int i))但是可以用普通委托指向方法else来编写它吗?谢谢
List<int> listOfInts = new List<int> { 1, 2, 3, 4, 5 };
List<int> result =
listOfInts.FindAll(delegate(int i) { return i < 3; });
Run Code Online (Sandbox Code Playgroud) 假设我们有一个Class1的通用列表,通常有给定会话的约100个对象.我想看看列表是否有特定的对象.ASP.NET 2.0允许我这样做:
Dim objResult as Class1 = objList.Find(objSearch)
Run Code Online (Sandbox Code Playgroud)
与传统的For循环相比,从性能角度来看,这种方法的速度如何?
如何随着列表长度的增加或减少而变化?
MSDN定义了System.Predicate 这种方式:
表示定义一组条件的方法,并确定指定的对象是否满足这些条件.
这真的意味着什么,或者它通常用于什么?因为对我来说它只是看起来像一个预定义的delegate,其方法必须采取object的type T,并返回bool-仅此而已.
我错过了什么吗?
作为这项调查的结果,我们知道使用特殊功能(针对某些类型的数据进行了优化)是一个好主意.我想创建一个哈希表,但是这个来源说:
句法:
make-hash-table&key test size rehash-size rehash-threshold => hash-table
论点和价值观:
test - eq,eql,equal或equalp函数之一的指示符.默认为eql.
好吧.如果我想在使用字符串并使用时加速我的程序string-equal怎么办?关于其他高阶函数的等式谓词没有限制,但make-hash-table它们是.这是什么原因?
奖金"lisp历史"问题:为什么函数gethash这样命名?为什么不get-hash呢?
考虑下面的数组.数组包含"Alpha"类型的对象.我们只关心username类型的财产NSString.
NSArray *some_usernames = @[ <multiple values of type Alpha> ]
NSArray *all_usernames = @[ <multiple values of type Alpha> ]
Run Code Online (Sandbox Code Playgroud)
我基本上想要一个不在数组中的所有用户名的列表some_usernames,即
NSArray *remaining_usernames = @[ <all_usernames but not in some_usernames> ];
Run Code Online (Sandbox Code Playgroud)
我打算做的方式是:
NSPredicates *predicates;
for (Alpha *alpha in some_usernames)
{
predicate = [predicate with @"username != %@", alpha.username];
predicates.add(predicate)
}
create compound predicate
filter all_usernames
Run Code Online (Sandbox Code Playgroud)
但这感觉就像这样做的坏方法.有两种方法可以做到这一点吗?我以前见过它但我不能再指向代码引用了.
在这个在线教程中,他们使用lambda来过滤用户列表:
List<User> olderUsers = users.stream().filter(u -> u.age > 30).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个接受lambda(u -> u.age > 30部分)的函数,这样我就可以在这个lambda中放入任何我想要的标准.但我有点坚持如何实现这一点.我做了一个空接口Filter,我做了以下方法:
public List<User> filterUsers(Filter f, List<User users>){
return users.stream().filter(f).collect(Collectors.toList());
}
public Filter olderThan(int age) {
return u -> u.getAge() > age;
}
Run Code Online (Sandbox Code Playgroud)
但这会产生许多错误.
(我做了一个age领域的吸气剂user).有没有办法调整界面Filter或其他方法使其工作?
我到处寻找,甚至用一些永远不会消失的病毒警告信息打到一些可疑的网站,我无法弄清楚这一点.
我只是想Results<T>按日期过滤对象:
let messages = realm.objects(RMChatMessage).filter("timestamp > \(date)) AND (timestamp <= \(to))"))
Run Code Online (Sandbox Code Playgroud)
无论何时运行此行,它都会引发以下情况:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "timestamp > 1970-01-01 00:00:00 +0000"'
*** First throw call stack:
(
0 CoreFoundation 0x000000010fba8c65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000011174ebb7 objc_exception_throw + 45
2 Foundation 0x000000010ffb66bd _qfqp2_performParsing + 8495
3 Foundation 0x000000010ffb4526 +[NSPredicate predicateWithFormat:arguments:] + 46
...
Run Code Online (Sandbox Code Playgroud)
我尝试使用NSDateFormatter格式yyyy-MM-dd hh:mm:ss,或者date.description,使用NSPredicate(format:...)而不是Result<T>.filter(...)等等,但没有任何效果.
这是Realm中的一些错误吗?
当我读到评论时,我正在阅读一个不相关的帖子:任何时候我发现自己需要一个多行lambda,我将这些行移动到私有方法并传递方法引用而不是lambda.
我在问:实现这种行为的正确方法是什么?使用在注释中发布的布尔方法,还是使用谓词?
例如:让我们说我想检查是否Table可用,其中可用的手段isClean,isEmpty,hasChair.
class Table{
public boolean hasChair(){...}
public boolean isClean(){...}
public boolean isEmpty(){...}
}
Run Code Online (Sandbox Code Playgroud)
我可以List<Table> tablesList = Arrays.asList(table1,table2,table3,table4);用两种方式为我的列表实现我的过滤测试:第一个用布尔值:
public boolean isUsable(){
return hasChair() && isClean() && isEmpty();
}
Run Code Online (Sandbox Code Playgroud)
并使用它 tablesList.stream().filter(Table::isUsable)
第二种方式是谓词:
public Predicate<Table> isUsable(){
return table -> table.isEmpty() && table.isClean() && table.hasChair();
}
Run Code Online (Sandbox Code Playgroud)
适用于 tablesList.stream().filter(isUsable())
哪个是正确的实施?为什么选择一个而不是其他?有什么大不同吗?
我是Haskell的新手,但我仍然想尽办法。我正在尝试将两个函数(isMark以及isAlpha来自包中的Data.Char模块base)合并为Data.Text.filter函数的第一个参数。到目前为止,我尝试过的是:
import qualified Data.Char as C
import qualified Data.Text as T
import Data.Text (Text)
strippedInput :: Text -> Text
strippedInput input = T.filter (C.isMark || C.isAlpha) input
Run Code Online (Sandbox Code Playgroud)
这不起作用,或者
strippedInput input = T.filter (C.isMark . C.isAlpha) input
Run Code Online (Sandbox Code Playgroud)
但显然它也不管用,因为类型C.isAlphaIS Char -> Bool然后成为一个输入C.isMark,这也是类型Char -> Bool等等类型不匹配。
我想在谓词中实现“ C.isMark或C.isAlpha”逻辑,但是由于我的知识非常有限,我对如何搜索解决方案的想法已经用尽。
predicate ×10
java ×3
.net ×2
c# ×2
generics ×2
ios ×2
java-8 ×2
common-lisp ×1
comparison ×1
definition ×1
filter ×1
hashtable ×1
haskell ×1
java-stream ×1
lambda ×1
lisp ×1
list ×1
objective-c ×1
realm ×1
singleton ×1
swift ×1
syntax ×1
text ×1