具体来说,我正在寻找类似干净的符号Collection<T>.TrueForAll/ Exists等.
编写一个foreach循环来检查每个对象上方法的返回感觉很臭,所以我希望有一个更好的Java习语.
我有一个类CMyVector,它包含一个指向CMyClass对象的指针向量,我有几个"查找"函数,可以根据不同的标准查找元素.例如,我有:
CMyClass* CMyVector::FindByX(int X);
CMyClass* CMyVector::FindByString(const CString& str);
CMyClass* CMyVector::FindBySomeOtherClass(CSomeOtherClass* ptr);
// Other find functions...
Run Code Online (Sandbox Code Playgroud)
首先,它们被实现为循环,遍历向量,寻找匹配X,str,ptr或其他的元素.所以我创建了谓词,就像这样:
class IsSameX:public unary_function<CMyClass*, bool>
{
int num;
public:
IsSameX(int n):num(n){}
bool operator()(CMyClass* obj) const
{
return (obj != NULL && (obj->X() == num));
}
};
Run Code Online (Sandbox Code Playgroud)
并以一堆看起来像这样的函数结束:
CMyClass* CMyVector::FindByX( int x )
{
CMyVector::iterator it = find_if(vec.begin(), vec.end(), IsSameX(x));
if (it != vec.end())
{
return *it;
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
它们看起来都是一样的,除了被调用的谓词,所以我想到了简化更多,并创建了一个像这样的函数:
CMyClass* CMyVector::Find( ThisIsWhatIDontKnow Predicate)
{
CMyVector::iterator it = find_if(vec.begin(), vec.end(), …Run Code Online (Sandbox Code Playgroud) 我已经读过SO问题斜杠(/)在prolog中做了什么?而什么是序言(SWI-Prolog的)谓词"简单/ 1"的含义,但这些链接似乎并没有帮助我.
我正在学习一些关于Prolog的初学者教程.短语喜欢Solve/4或Go/1困惑我.这个斜线和数字是什么意思?
因此,根据我对确定性谓词的理解:
确定性谓词= 1解
非确定性谓词=多个解决方案
是否有任何类型的规则可以检测谓词是一个还是另一个?喜欢看搜索树等
我正在尝试从实体框架转换为Dapper,以期提高数据访问性能.
我使用的查询是谓词形式,如"Expression>".
举个例子:
我有以下代码,我需要转换为使用Dapper.
我目前在做什么:
public async Task<List<TModel>> Get(Expression<Func<TModel, bool>> query)
{
// this.Context is of type DbContext
return await this.Context.Set<TModel>().Where(query).ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)
我想做什么:
public async Task<List<TModel>> Get(Expression<Func<TModel, bool>> query)
{
using (IDbConnection cn = this.GetConnection)
{
return await cn.QueryAsync<TModel>(query);
}
}
Run Code Online (Sandbox Code Playgroud)
我的google-fu让我失望,有人可以帮忙.
编辑:
请注意,我找到了:https: //github.com/ryanwatson/Dapper.Extensions.Linq
但我似乎无法弄清楚如何使用它.
我需要使用基于布尔函数的谓词来组合流操作.通过将方法的参数重新抛出为谓词找到了一种解决方法,如下所示:
public <T> Predicate<T> pred(final Predicate<T> aLambda) {
return aLambda;
}
public List<String> foo() {
return new ArrayList<String>().stream() //of course, this does nothing, simplified
.filter(pred(String::isEmpty).negate())
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
'pred'方法似乎无能为力,但不是这样:
public List<String> foo() {
return new ArrayList<String>().stream()
.filter((String::isEmpty).negate())
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
也没有任何内联转换:
public List<String> foo() {
return new ArrayList<String>().stream()
.filter(((Predicate)String::isEmpty).negate())
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
似乎工作.失败了
此表达式的目标类型必须是功能接口
在'pred(...)'方法中,花式转换发生了什么?
为什么以下代码返回Predicate<String>而不是boolean?
我的理解是!s.isEmpty()这里的检查是违反谓词boolean test(T t);的boolean.这里的返回类型是.
所以在我的lambda中,我的nonEmptyStringPredicate不是类型boolean吗?显然,它不是,我只是想了解它为什么不是.
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
Run Code Online (Sandbox Code Playgroud) 我正在使用Java11.学习一种新的方法Predicate.not,我发现我目前的代码只找到猫科:
List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");
Set<String> filterCat = animals.stream().filter(cats).collect(Collectors.toSet());
System.out.println(filterCat);
Run Code Online (Sandbox Code Playgroud)
输出是:
豹,猫,狮子
现在我正在尝试使用新方法,输出结果不正确.我该如何纠正?我做错了什么?
我后来的代码:
Predicate<String> updatedCatFilter = Predicate.not(a -> a.equals("dog") && a.equals("horse"));
Set<String> catFamily = animals.stream().filter(updatedCatFilter).collect(Collectors.toSet());
System.out.println(filterCat);
Run Code Online (Sandbox Code Playgroud)
但是现在输出我的所有列表.
马,豹,猫,狗,狮子
我有一个TreeSet字符串(硬编码).想要检查给定的参数String例如."Person"如果存在于TreeSet中则返回true否则返回false.
在这里我对关于(Predicate<? super String> s)vs 的Eclipse消息感到困惑
(String s):
类型Stream中的方法anyMatch(Predicate)不适用于参数(String)
请指导.
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Predicate;
public class SystemLabelValidator {
public static boolean ValidateSystemLabel( String s) {
String j = s;
boolean b = false;
Set <String> SystemLabels = new TreeSet<String>();
// Unique Strings
SystemLabels.add("Person");
SystemLabels.add("Player");
SystemLabels.add("Hospital");
SystemLabels.add("Nurse");
SystemLabels.add("Room");
System.out.println("\n==> Loop here.");
for (String temp : SystemLabels) {
System.out.println(temp);
if(SystemLabels.stream().anyMatch(j)) {
System.out.println("I need to return Boolean");
}
return b;
}
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试在中搜索元素List<String>,但收到此编译错误:
get(int)类型中的方法List<String>不适用于参数字符串。
这是代码:
private boolean findIdInTheList(List<String> ids, String id) {
String theId = ids.stream()
.filter(elem -> id.equals(ids.get(elem)))
.findAny()
.orElse(null);
}
Run Code Online (Sandbox Code Playgroud)