如何使用Java中的url参数过滤List?

时间:2016-12-15 18:11:17

标签: java

如何根据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)'

1 个答案:

答案 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毫秒的笔记本电脑。