Java 动态创建谓词

Java 动态创建谓词,java,lambda,predicate,Java,Lambda,Predicate,我有一个用户输入字符串[],我想根据设备的主机名是否包含任何用户输入来筛选设备集合 我试着按照课程来做这件事 interface PredicateOperation{ Predicate operation(String[] input); } public Predicate getPredicate(String[] input, PredicateOperation op){ return op.operation(input); } private TufinDev

我有一个用户输入字符串[],我想根据设备的主机名是否包含任何用户输入来筛选设备集合

我试着按照课程来做这件事

interface PredicateOperation{
    Predicate operation(String[] input);
}

public Predicate getPredicate(String[] input, PredicateOperation op){
    return op.operation(input);
}

private TufinDeviceCollection<TufinDevice> filter(TufinDeviceCollection<TufinDevice> devices) {        

       //Check if any HostNames of the devices contain any of the items in String[] modelContains

            devices = devices.stream()
                    .sequential()
                    .filter(//How do i create this predicate?)//we need to create the lamda expression to evaulate if the hostName of device d contains any of the items String[] userInput
                    .collect(Collectors.toCollection(TufinDeviceCollection<TufinDevice>::new));

    }
接口谓词操作{
谓词操作(字符串[]输入);
}
公共谓词getPredicate(字符串[]输入,谓词操作op){
返回操作(输入);
}
专用TufinDeviceCollection筛选器(TufinDeviceCollection设备){
//检查设备的主机名是否包含字符串[]modelContains中的任何项
devices=devices.stream()

.filter(//如何创建此谓词?//我们需要创建lamda表达式,以评估设备d的主机名是否包含字符串[]userInput中的任何项
.collect(收集器.toCollection(TufinDeviceCollection::new));
}
我不清楚如何定义.filter(..)中的谓词操作

但是您需要
String[]userInput
才能从
filter
方法访问

我猜这是试图编写自己的
@functionanterface
来取代标准的
谓词

不过,这不太实际

PredicateOperation operation = (String[] input) -> ((Object o) -> true);
如果可以返回结果,为什么需要返回
谓词
?一个稍微增强的版本就可以了

interface PredicateOperation {
    boolean operation(String[] input);
}

这对于流API仍然不是特别有用,因为
Stream#filter
需要的是
java.util.function.Predicate
,而不是您的类型


而且,是的,停止使用原始的
谓词
s.

为了可读性和可重用性,我更喜欢在单独的一行上分离谓词,然后在
filter()
上应用它。所以代码有点像:

private TufinDeviceCollection<TufinDevice> filter(TufinDeviceCollection<TufinDevice> devices) {        

   Predicate< ? super TufinDevice> deviceFilter = device -> Arrays.stream(userInput)
                                                 .anyMatch(input -> device.getHostName().contains(input));

   devices = devices.stream()
                .sequential()
                .filter(deviceFilter)
                .collect(Collectors.toCollection(TufinDeviceCollection<TufinDevice>::new));

}
专用TufinDeviceCollection筛选器(TufinDeviceCollection设备){
谓词<?超级TufinDevice>deviceFilter=device->Arrays.stream(用户输入)
.anyMatch(输入->设备.getHostName().contains(输入));
devices=devices.stream()

.过滤器(设备过滤器)
.collect(收集器.toCollection(TufinDeviceCollection::new));
}

我不清楚您到底想做什么,但作为澄清的第一步——包括您自己——停止使用原始
谓词。适当地参数化该类型的所有用法。我认为您应该添加一个解释。我的想法是,我将重用该接口来动态地在device.ip、.hostname上执行其他筛选器etc@JamieSnipes你为什么不喜欢谓词呢?我真的不知道我更喜欢什么。这是我第一次尝试。
PredicateOperation operation = (String[] input) -> ((Object o) -> true);
interface PredicateOperation {
    boolean operation(String[] input);
}
PredicateOperation operation = (String[] input) -> true;
private TufinDeviceCollection<TufinDevice> filter(TufinDeviceCollection<TufinDevice> devices) {        

   Predicate< ? super TufinDevice> deviceFilter = device -> Arrays.stream(userInput)
                                                 .anyMatch(input -> device.getHostName().contains(input));

   devices = devices.stream()
                .sequential()
                .filter(deviceFilter)
                .collect(Collectors.toCollection(TufinDeviceCollection<TufinDevice>::new));

}