stream特性的简单应用:敏感词筛查的性能对比
java 8 中的stream给了我们很大的遍历,其基于四大类型的函数式编程,函数式编程这里太简单了就不再记录了,本文只是测试一下一个偶然发现的自己代码的性能短板,之前一直想着filter完后,剩下的数大于0时说明能够筛选到数据,但是数据多了以后,这个操作会很慢。
自行翻阅底层源码后,使用了findAny替代,性能指数级提升!
需求描述:
用户输入一组可能带有敏感词的数据,将这组数据与敏感词进行比较,如果包含任何敏感词汇,将符合条件的数据标记出来。
实现方法:
将敏感词表从数据库中找出来,使用stream.filter进行对比。
可见,filter.findany效率远远高于count>0。代码如下:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
for (long i = 0; i < 10000000L; i++) {
map.put(String.valueOf(i), String.valueOf(i));
}
List<String> target = Lists.newArrayList("123123123", "234234234", "345345345", "456456456", "678678678");
Long t1Result = t1(map, target);
System.out.println("============t1===========");
Long t2Result = t2(map, target);
System.out.println("============t2===========");
System.out.println("t1=" + t1Result.toString() + " t2=" + t2Result.toString());
}
public static long t1(Map<String, String> map, List<String> target) {
long start = System.currentTimeMillis();
for (String s : target) {
if (map.keySet().stream().filter(e -> {
return s.contains(e);
}).count() > 0) {
System.out.println(s + " found");
}
}
long end = System.currentTimeMillis();
return end - start;
}
public static long t2(Map<String, String> map, List<String> target) {
long start = System.currentTimeMillis();
for (String s : target) {
if (map.keySet().stream().filter(e -> {
return s.contains(e);
}).findAny().isPresent()) {
System.out.println(s + " found");
}
}
long end = System.currentTimeMillis();
return end - start;
}
123123123 found
234234234 found
345345345 found
456456456 found
678678678 found
============t1===========
123123123 found
234234234 found
345345345 found
456456456 found
678678678 found
============t2===========
t1=1685 t2=2