考虑以下代码:
struct T
{
bool status;
UsefulData data;
};
std::forward_list<T> lst;
lst.remove_if([](T &x) -> bool { return x.status= !x.status; });
Run Code Online (Sandbox Code Playgroud)
即一次性切换状态和删除非活动元素.
根据cppreference,上面的代码似乎是未定义的行为(强调我的):
Run Code Online (Sandbox Code Playgroud)template< class UnaryPredicate > void remove_if( UnaryPredicate p );
p- 一元谓词,如果要删除该元素,则返回true.谓词函数的签名应等效于以下内容:Run Code Online (Sandbox Code Playgroud)bool pred(const Type &a);签名不需要
const &,但该函数不能修改传递给它的对象.类型Type必须使得类型的对象forward_list<T,Allocator>::const_iterator可以被解除引用然后隐式转换为Type.
但是,目前的工作草案似乎限制性较小(N4659 [ forwardlist.ops ]):
Run Code Online (Sandbox Code Playgroud)void remove(const T& value) template <class Predicate> void remove_if(Predicate pred);功效:
删除列表迭代器引用的列表中的所有元素,
i其中包含以下条件:(*i == valueforremove()),pred(*i)istrue …
我有一个问题,我相信你帮我解决了皱纹问题.
我有
List<Predicate<TaskFx>> predicates
Run Code Online (Sandbox Code Playgroud)
我想在这里使用这些谓词
taskFxList.stream().filter(predicates).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
作为一个谓词合并如下:
predicate1.and(predicate2).and...
Run Code Online (Sandbox Code Playgroud)
我有一个表(13列),其中包含一些结果(在JavaFx中)和6个字段,可以通过这些字段中的值在此表中搜索.我只能输入3个字段的值,所以我的
predicates.size() = 3;
Run Code Online (Sandbox Code Playgroud)
问题是如何最好地动态准备一个
Predicate<TaskFx> predicate
Run Code Online (Sandbox Code Playgroud)
包含由x.and(y).和(z)合并的所有谓词
非常感谢您的帮助!
注意:这个问题是不相关的java.util.Optional.
在处理流时,我经常使用这样的逻辑:
Stream<FooBar> stream = myInitialStream();
if (needsFilter1) stream = stream.filter(c -> whatever1());
if (needsFilter2) stream = stream.filter(c -> whatever2());
...
return stream.collect(toList());
Run Code Online (Sandbox Code Playgroud)
我想要实现的是使用链接将上面的代码转换为单个表达式.我发现这更具可读性和直接性.到目前为止,我发现实现这一目标的唯一方法是:
return myInitialStream()
.filter(needsFilter1? c->whatever1() : c->true)
.filter(needsFilter2? c->whatever2() : c->true)
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
尽管如此,这会对那些琐碎的c->truelamdas 进行不必要的调用,这可能会在扩展时产生一些性能成本.
所以我的问题是:是否有更好的方法来生成包含可选过滤的链式流表达式?
更新:也许我没有说清楚,但我的问题是找到单表达式解决方案.如果非要使用多个语句(初始化谓词,例如),我还可以用我的问题基本上不相同的第一个代码块.
我正在开发多层应用程序解决方案,我的解决方案如下所示
我的Business.Process项目(业务层)只知道Business.DomainObject和Data.Repository项目,因此不知道并且与 Data.Sql.Entity 项目没有关系
我将业务(域)对象发送到存储库并执行在这个项目内部进行映射,然后我在存储库层内使用关系数据层进行 CRUD 过程。
我的传统领域对象是这样的,它只有属性
public class UserBO
{
public string Email { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的业务层类是这样的,
Repository r = new UserRepository();
r.Insert(myUserDomainObject);
Run Code Online (Sandbox Code Playgroud)
一切都很好,但是我的“谓词”查询有一些问题。我的存储库接口中有一个方法
bool IsExists(Expression<Func<BusinessObject,bool>> predicate);
Run Code Online (Sandbox Code Playgroud)
并像这样在我的业务层中使用它;
Repository r = new UserRepository(); <br/>
r.IsExists(p => p.Email.Equals("email address"));
Run Code Online (Sandbox Code Playgroud)
如您所见,它的参数是“业务对象”,但我的实际存储库(与数据库连接)使用我的 dbml 文件内的“数据对象”。
public override bool IsExists(Expression<Func<DataObject, bool>> predicate){
return …Run Code Online (Sandbox Code Playgroud) Clojure 中是否有一种快速方法来检查序列是否恰好有 1 个元素?请注意,序列可能包含 nils。
如果我正确读取源代码,调用count序列需要 O(n) 时间。
替代解决方案:
(and
(not (empty? a-seq))
(empty? (rest a-seq)))
Run Code Online (Sandbox Code Playgroud)
文档说调用empty?集合与coll调用相同(not (seq coll)),但他们没有指定其效率或调用empty?序列时会发生什么。我尝试在 github 存储库中搜索其empty?实现方式,但它忽略了搜索中的问号,并且出现了大量“空”的点击。我想empty?是restO(1),但话又说回来,count不是......
当我尝试使用 Querydsl(如 Spring 参考Spring 1.10.4.RELEASE 参考中所示)时,我从 IDE 中收到一些错误:无法解析方法 findAll(predicate)。我将导入更改为 com.mysema.query.types.Predicate。现在方法看起来不错。但我无法解决问题:
Predicate predicate = user.getUsername().equalsIgnoreCase(username).and((user.getId().equals(userid)).not);
Run Code Online (Sandbox Code Playgroud)
我收到错误:无法解析方法:并且无法解析方法。
一些参考:示例 32. 存储库上的 Querydsl 集成
interface UserRepository extends CrudRepository<User, Long>, QueryDslPredicateExecutor<User> {
}
Run Code Online (Sandbox Code Playgroud)
以上允许使用 Querydsl Predicate 编写类型安全查询。
Predicate predicate = user.firstname.equalsIgnoreCase("dave")
.and(user.lastname.startsWithIgnoreCase("mathews"));
userRepository.findAll(predicate);
Run Code Online (Sandbox Code Playgroud)
但例子是不正确的。有人知道如何使用这个吗?
我必须在 Prolog 中创建家庭关系来完成一项作业,我偶然发现了这个问题。
man(john).
woman(lisa).
married(john,lisa).
?- married(john,X).
X = lisa.
?- married(X,john).
false.
Run Code Online (Sandbox Code Playgroud)
如何使这个谓词以两种方式起作用?如果约翰嫁给了丽莎,那么丽莎也嫁给了约翰。
对于事实,我只能使用性别、父母和已婚:
man(john).
woman(lisa).
parent(john,steve).
parent(lisa,steve).
married(john,lisa).
Run Code Online (Sandbox Code Playgroud)
这个要求使得这个解决方案对我来说无法使用。我不能只添加关系,wife(lisa,john).因为我必须自己定义妻子、丈夫等。
wife(X,Y) :- woman(X),married(X,Y).
Run Code Online (Sandbox Code Playgroud) 我使用带有 Spring REST 端点的 QueryDSL 谓词对象来检索和查询参数值。
@GetMapping("/{subjectId}/students")
@RolesAllowed( {Roles.PLATFORM_ADMIN, Roles.USER})
public List<StudentResponse> getAllStudents(@PathVariable final String subjectId,
@QuerydslPredicate(root = Student.class) final Predicate predicate) {
final Predicate searchPredicate = studentPredicate()
.predicate(predicate)
.subjectId(subjectId)
.build();
return studentService.findBySubjectId(subjectId, searchPredicate);
}
Run Code Online (Sandbox Code Playgroud)
Student类包含studentId和studentName属性;
现在,如果有人调用https://hostname/ {subjectId}/students?studentId=1234&studentName=test
然后上面的代码生成带有参数值的谓词对象。但是我需要从谓词对象中获取以上 2 个参数值,以便除了数据库查询之外进行进一步处理。我没有看到谓词对象有任何支持方法来检索值。那么我该怎么做呢?
我有一系列谓词子句,像这样
student?.firstName?.equals("John") ?: false &&
student?.lastName?.equals("Smith") ?: false &&
student?.age?.equals(20) ?: false &&
student?.homeAddress?.equals("45 Boot Terrace") ?: false &&
student?.cellPhone?.startsWith("123456") ?: false
Run Code Online (Sandbox Code Playgroud)
我发现可以切换到布尔谓词and()而不是&&,但总的来说,它并没有使代码更简洁。
Kotlin 有没有办法简化这样的表达?
假设我有以下谓词作为 Villager POJO 的预定义 lambda。
val matchesSearch: (Villager, String) -> Boolean =
{ villager: Villager, query: String -> villager.name.contains(query) }
val matchesGender: (Villager, Int) -> Boolean =
{ villager: Villager, filter: Int -> filter == villager.gender }
val matchesPersonality: (Villager, Int) -> Boolean =
{ villager: Villager, filter: Int -> filter == villager.personality }
val matchesSpecies: (Villager, Int) -> Boolean =
{ villager: Villager, filter: Int -> filter == villager.species }
val matchesHobby: (Villager, Int) -> Boolean =
{ villager: …Run Code Online (Sandbox Code Playgroud)