标签: predicate

对std :: forward_list :: remove_if谓词的要求

考虑以下代码:

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,上面的代码似乎是未定义的行为(强调我的):

template< class UnaryPredicate >
void remove_if( UnaryPredicate p );
Run Code Online (Sandbox Code Playgroud)

p - 一元谓词,如果要删除该元素,则返回true.谓词函数的签名应等效于以下内容:

bool pred(const Type &a);
Run Code Online (Sandbox Code Playgroud)

签名不需要const &,但该函数不能修改传递给它的对象.类型Type必须使得类型的对象forward_list<T,Allocator>::const_iterator可以被解除引用然后隐式转换为Type.

但是,目前的工作草案似乎限制性较小(N4659 [ forwardlist.ops ]):

void remove(const T& value)
template <class Predicate> void remove_if(Predicate pred);
Run Code Online (Sandbox Code Playgroud)

功效:

删除列表迭代器引用的列表中的所有元素,i其中包含以下条件:( *i == valuefor remove()),pred(*i)is true …

c++ predicate list language-lawyer c++11

6
推荐指数
1
解决办法
288
查看次数

如何组合List <Predicate <MyClass >>中的所有谓词

我有一个问题,我相信你帮我解决了皱纹问题.

我有

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 predicate java-8 java-stream

6
推荐指数
1
解决办法
1027
查看次数

Java流:对链接使用可选的filter()操作

注意:这个问题是相关的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 进行不必要的调用,这可能会在扩展时产生一些性能成本.

所以我的问题是:是否有更好的方法来生成包含可选过滤的链式流表达式?

更新:也许我没有说清楚,但我的问题是找到单表达式解决方案.如果非要使用多个语句(初始化谓词,例如),我还可以用我的问题基本上不相同的第一个代码块.

java lambda predicate java-8 java-stream

6
推荐指数
1
解决办法
220
查看次数

C# 在彼此之间转换谓词

我正在开发多层应用程序解决方案,我的解决方案如下所示

  • 业务.域对象
  • Business.Process(*实际业务层)
  • 数据映射器
  • 数据存储库
  • Data.Sql.Entity(* 具有 .dbml 文件的实际数据层)

我的Business.Process项目(业务层)只知道Business.DomainObjectData.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)

c# linq predicate linq-to-sql

5
推荐指数
1
解决办法
3976
查看次数

Clojure:O(1) 函数检查序列是否恰好有 1 个元素

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不是......

performance functional-programming predicate clojure

5
推荐指数
1
解决办法
1009
查看次数

如何为 QueryDslPredicateExecutor 编写谓词

当我尝试使用 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)

但例子是不正确的。有人知道如何使用这个吗?

spring predicate querydsl spring-data spring-data-jpa

5
推荐指数
1
解决办法
1974
查看次数

Prolog 双向谓词

我必须在 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)

predicate prolog bidirectional

5
推荐指数
1
解决办法
1593
查看次数

从 QueryDSL 谓词对象中获取参数

我使用带有 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类包含studentIdstudentName属性;

现在,如果有人调用https://hostname/ {subjectId}/students?studentId=1234&studentName=test

然后上面的代码生成带有参数值的谓词对象。但是我需要从谓词对象中获取以上 2 个参数值,以便除了数据库查询之外进行进一步处理。我没有看到谓词对象有任何支持方法来检索值。那么我该怎么做呢?

java rest spring predicate querydsl

5
推荐指数
1
解决办法
3659
查看次数

如何简化 Kotlin 中的谓词链

我有一系列谓词子句,像这样

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 有没有办法简化这样的表达?

boolean predicate chain kotlin

5
推荐指数
1
解决办法
2480
查看次数

有条件地组合 Kotlin 中的 Lambda 以使用多个谓词进行过滤

假设我有以下谓词作为 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)

android predicate filter kotlin

5
推荐指数
1
解决办法
7162
查看次数