Java Lambda流过滤器中谓词的外部化

Java Lambda流过滤器中谓词的外部化,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我有一个数据模型的ArrayList,它有10个字段,基于用户输入,我需要动态地将用户选择的字段上的谓词条件应用于流过滤器 下面的代码段应用了其中一个字段itemDesc,但在运行时用户可以选择任何字段 Predicate<DataModel> contains = (n) -> n.getItemDesc().contains(query); List filtered = data.stream().filter(contains).collect(Coll

我有一个数据模型的ArrayList,它有10个字段,基于用户输入,我需要动态地将用户选择的字段上的谓词条件应用于流过滤器

下面的代码段应用了其中一个字段itemDesc,但在运行时用户可以选择任何字段

Predicate<DataModel> contains = (n) -> n.getItemDesc().contains(query);        
List filtered = data.stream().filter(contains).collect(Collectors.toList());
谓词contains=(n)->n.getItemDesc().contains(查询);
List filtered=data.stream().filter(contains).collect(Collectors.toList());

基本上,我们需要动态地构建谓词,而不是预定义的谓词,如果是这样的话,是否有可能构建任何示例。提前感谢。

这取决于解决方案的动态性。对于十个属性,可以接受在编译时有一个显式的属性列表,而不是动态(反射)发现

可用属性的声明可能如下所示

enum DataModelProperty {
    ITEM_DESC(DataModel::getItemDesc),
    FOO(DataModel::getFoo),
    BAR(DataModel::getBar)
    // the other seven properties…
    ;
    final Function<DataModel,String> getter;

    private DataModelProperty(Function<DataModel, String> f) {
        getter = f;
    }
    public Function<DataModel, String> getPropertyGetter() {
        return getter;
    }
    public Predicate<DataModel> asPredicate(String query) {
        return n -> getter.apply(n).contains(query);
    }
}

谢谢,我试过你的方法,帮了大忙。能够动态构建具有各种属性和条件的谓词。干杯
DataModelProperty p=DataModelProperty.valueOf("ITEM_DESC");// just as example

List<DataModel> filtered = data.stream()
                               .filter(p.asPredicate(query))
                               .collect(Collectors.toList());