我有一个谓词列表 ( List<Predicate<String>>),我想使用or方法将其链接到一个谓词中。我如何使用 Stream API 来实现这一目标?
我想要实现的是使用带有动态谓词的过滤函数。到目前为止我所做的是创建一个选择最佳谓词的函数:
fun buildDatePredicate(dateFrom: LocalDate?, dateTo: LocalDate?): Predicate<MyClass> {
if (dateFrom != null && dateTo == null) {
return Predicate { myItem -> myItem.date.isAfter(dateFrom) }
}
if (dateTo != null && dateFrom == null) {
return Predicate { myItem -> myItem.date.isBefore(dateTo) }
}
if (dateTo != null && dateFrom != null) {
return Predicate { myItem ->
myItem.date.isBefore(dateTo) && myItem.date.isAfter(dateFrom)
}
}
return Predicate { true }
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用该谓词在我的列表上使用过滤器
myList.filter { buildDatePredicate(fromDate.toLocalDate(),toDate.toLocalDate()) }
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为
Type mismatch.
Required:
Boolean
Found:
Predicate<MyClass>
Run Code Online (Sandbox Code Playgroud)
有可能实现我想做的事情吗? …
我最近从一家公司进行了评估,该公司有一个案例,他们希望将谓词设置为方法的输入参数。对此我几乎没有经验,我一直在自己研究。代码如下:
using System;
public interface IBird
{
Egg Lay();
}
public class Chicken : IBird
{
public Chicken()
{
}
public void EggLay()
{
}
public Egg Lay()
{
return new Egg();
}
}
public class Egg
{
public Egg(Func<IBird> createBird)
{
throw new NotImplementedException("Waiting to be implemented.");
}
public IBird Hatch()
{
throw new NotImplementedException("Waiting to be implemented.");
}
}
public class Program
{
public static void Main(string[] args)
{
// var chicken1 = new Chicken();
// var egg …Run Code Online (Sandbox Code Playgroud) 我正在尝试all使用foldr. p是谓词。我知道这是可以做到的:
all p = and . foldr (\x xs -> p x : xs) []
Run Code Online (Sandbox Code Playgroud)
但我想做的是将函数and转换为foldr方程。这能做到吗?
我尝试了以下方法,但都失败了:
all p = foldr (\x p -> \ys -> and (p x) ys) True
all p = foldr (\x and -> (\ys -> (p x and ys))) True
all p = foldr (\x ys -> and . (p x) ys) True
Run Code Online (Sandbox Code Playgroud)
我对如何申请的理解不足foldr吗?