如何根据url参数过滤流的列表/集合,例如:
?filter=(type=="audio"&&systemBitrate<100000)||(type=="video"&&systemBitrate<1024000)
我知道这可以使用静态完成:
List<StreamItem> results = streamList.stream().filter(s -> s.type == "audio" && s.systemBitrate < 100000).collect(Collectors.toList());
简单对象:
public class StreamItem {
String name;
String type;
int systemBitrate;
}
我们的想法是以与下面相似的方式动态过滤播放清单,并仅播放选定的曲目:
curl -v 'http://demo.unified-streaming.com/video/tears-of-steel/tears-of-steel.ism/Manifest?filter=(type=="audio"%26%26systemBitrate<100000)||(type=="video"%26%26systemBitrate<1024000)'
答案 0 :(得分:0)
一种方法是使用&#34;表达语言&#34;图书馆, 编译过滤器表达式,然后将其应用于流的元素。
以下是使用MVEL的简短示例:
的pom.xml
<dependency>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>2.3.1.Final</version>
</dependency>
java code
Serializable expr = MVEL.compileExpression(
"(type==\"audio\"&&systemBitrate<100000)||(type==\"video\"&&systemBitrate<1024000)"
);
Arrays.asList(
new StreamItem("audio",10000),
new StreamItem("audio",200000),
new StreamItem("video",200000),
new StreamItem("video",2000000)
)
.stream()
.filter(e->MVEL.executeExpression(expr,e,boolean.class))
.forEach(System.out::println);
输出
Element{type='audio', systemBitrate=10000}
Element{type='video', systemBitrate=200000}
请注意,您的StreamItem类必须为类型和 systemBitrate 属性定义getter,以便MVEL能够解析它们。
不要期望这种速度非常快,但对于大多数实际任务来说仍然应该足够快,在使用之前将表达式编译好。
使用上面的表达式过滤1000000(一百万)个StreamItems的列表,平均需要大约150毫秒的笔记本电脑。