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));
}