标签: predicate

PredicateBuilder无法转换为IQueryable?

我有一个功能:

private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
   ...snip...
}
Run Code Online (Sandbox Code Playgroud)

现在执行LINQ查询:

private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
   return list.Where(item => item.Name.ContainsText(keyword)
      || item.Description.ContainsText(keyword)
      ...snip...
   );
}
Run Code Online (Sandbox Code Playgroud)

这段代码运行得很好.

我需要将其转换为使用PredicateBuilder:

private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
   var predicate = PredicateBuilder.False<Promotion>();     

   predicate = predicate.Or(item => item.Name.ContainsText(keyword)
         || item.Description.ContainsText(keyword)
         ...snip...
   );

   return list.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这不会编译.失败的路线是:

return list.Where(predicate);
Run Code Online (Sandbox Code Playgroud)

您可以选择错误:

  • 实例参数:无法从'System.Collections.Generic.IEnumerable'转换为'System.Linq.IQueryable'
  • 'System.Collections.Generic.IEnumerable'不包含'Where'的定义和最佳扩展方法重载'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'有一些无效的参数
  • 参数2:无法从'System.Linq.Expressions.Expression>'转换为'System.Func'

有什么问题?IEnumerable进去,IEnumerable出来.

我会说实话,我读了这个页面PredicateBuilder,我不明白其中任何一个.


一个淡淡,为什么我需要改变PredicateBuilder …

linq predicate iqueryable predicatebuilder

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

std :: set在运行时选择更少或更大的比较器

我正在重构一些代码,发现有两个地方可以使用相同的代码编写,除了一组的比较器less<double>在一个地方而greater<double>在另一个地方.就像是:

double MyClass::Function1(double val)
{
    std::set<double, less<double> > s;
    // Do something with s
}

double MyClass::Function2(double val)
{
    std::set<double, greater<double> > s;
    // Do the same thing with s as in Function1
}
Run Code Online (Sandbox Code Playgroud)

所以我想到了:

double MyClass::GeneralFunction(double val, bool condition)
{  
    if(condition)  
    {  
        // Select greater as comparator  
    }  
    else
    {  
        // Select less as comparator  
    }  

    set<double, comparator> s;  
    // common code
}
Run Code Online (Sandbox Code Playgroud)

我通过使用我的自定义比较器函数使它工作,如下所示:

bool my_greater(double lhs, double rhs)
{
    return lhs > rhs;
} …
Run Code Online (Sandbox Code Playgroud)

c++ stl predicate set

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

如何在Scheme中定义类型谓词

"普通"函数通常仅在给定类型的对象域上定义,但某些函数(如Scheme类型谓词list?procedure?)是为任何类型的参数定义的,甚至可以应用于它们自身.因此,例如(list? procedure?)评估#f(procedure? procedure?)评估#t.我试图找出如何编写这种完全定义的函数,但未能找到讨论这个的源.

例如,假设我们使用以下构造函数和选择器实现了计算机程序结构和解释的练习2.4中描述的对数据类型:

    (define (cons x y)
      (lambda (m) (m x y)))

    (define (car z)
      (z (lambda (p q) p)))

    (define (cdr z)
      (z (lambda (p q) q)))
Run Code Online (Sandbox Code Playgroud)

那么我如何定义一个谓词pair?,该谓词返回#t任何使用构造的东西cons,以及#f任何不构造的东西?更一般地,怎么都类型谓词喜欢list?procedure?实施?

scheme types predicate racket

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

检查"流"的所有元素是否相同

我正在改变我的一些旧代码以利用Java 8的功能方面.特别是,我正在使用Guava谓词java.util.function.Predicate.其中一个谓词是检查a是否Stream是同质的,即由所有相同的元素组成.

在我的旧代码中(使用Guava Predicate),我有这个:

static <T> Predicate<Iterable<T>> isHomogeneous() {
    return new Predicate<Iterable<T>>() {
        public boolean apply(Iterable<T> iterable) {
            return Sets.newHashSet(iterable).size() == 1;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这是新版本,使用java.util.function.Predicate:

public static Predicate<Stream<?>> isHomogeneous =
    stream -> stream.collect(Collectors.toSet()).size() == 1;
Run Code Online (Sandbox Code Playgroud)

IDE(IntellijIDEA v.12)没有显示任何红色波浪线表示错误,但是当我尝试编译时,我得到了这个:

java: no suitable method found for
collect(java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.Set<java.lang.Object>>)
  method java.util.stream.Stream.<R>collect(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,? super capture#2 of ?>,java.util.function.BiConsumer<R,R>) is not applicable
    (cannot infer type-variable(s) R
      (actual and formal argument lists differ in length))
  method java.util.stream.Stream.<R,A>collect(java.util.stream.Collector<? super capture#2 of …
Run Code Online (Sandbox Code Playgroud)

java predicate java-8 java-stream

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

如何为 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
查看次数

不兼容的类型:谓词<CAP#1>无法转换为谓词<?超级CAP#2>

这是我的代码.

import java.util.stream.Stream;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Predicate;

public class StreamMethod{
    public static void main(String... args){
        List<Integer> data = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8));

        allMatch(data, x -> x < 10);
    }

    public static <T> void allMatch(List<?> list, Predicate<? super T> predicate){
        boolean allSatisfy = list.stream().allMatch(predicate);
        System.out.println(allSatisfy);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到了错误incompatible types: Predicate<CAP#1> cannot be converted to Predicate<? super CAP#2>.你能帮我解决一下吗?为什么会显示此错误?

然后我也将上面的传递参数更改为

Predicate<Integer> pred= x -> x < 10;
allMatch(data, pred);
Run Code Online (Sandbox Code Playgroud)

但仍面临错误.

predicate java-8 java-stream

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

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
查看次数