当前位置: 首页 > 知识库问答 >
问题:

一个流上的Java多Regex过滤器

贺经纶
2023-03-14

我想要找到合适的正则表达式匹配的行数。输入是通过Java Stream插入的日志文件。我想对这个流应用多个过滤器,但每隔一段时间计算一次。

Stream<String> lines = Files.lines(path);

            // regex transformation to predicate for filter method
            String[] regs = {".*/e_miete_1\\.html.*", ".*/fa-portal/(.*\\.html|api/.*).*"};
            ArrayList<Predicate<String>> compRegs = new ArrayList<>();

            for(String reg : regs) {
                compRegs.add(Pattern.compile(reg).asPredicate());
            }

            // usage of predicate
            
            eMiete = lines
                    .filter(compRegs.get(0))
                    .count();

            clicks = lines
                    .filter(compRegs.get(1))
                    .count();
        System.out.println(eMiete);
        System.out.println(clicks);

共有1个答案

宋育
2023-03-14

如果只有2个谓词,请使用带有Collectors.teeing()的Yassin解决方案。对于不同数量的谓词,可以使用:

    String[] regs = {.....};
    ArrayList<Predicate<String>> compRegs = new ArrayList<>();

    for(String reg : regs) {
        compRegs.add(Pattern.compile(reg).asPredicate());
    }

    int[] countPerPredicate = lines.collect(
            ()->new int[compRegs.size()],               // supplier 
          
            (int[] arr, String line)->{                 // accumulator
                for (int i=0; i<arr.length; i++) {
                    if (compRegs.get(i).test(line)) {
                        arr[i]++;
                    }
                }
            },
            (int[] arr1, int[] arr2) -> {               // combiner
                for (int i=0; i<arr1.length; i++) {
                    arr1[i] += arr2[i];
                }
            }
        );

    //System.out.println(Arrays.toString(countPerPredicate ));
 类似资料:
  • 我收集了< code > 我想找到“每种类型中的一种”,尽管我想找到产品集合中每个谓词的第一个匹配项。 目前我的代码如下: 但这当然会多次迭代产品集合,这是不需要的,因为在我的例子中,我有100000个产品和64个谓词,并且需要很长时间。 在我的特例中,谓词是互斥的:如果一个谓词返回true,那么对于该特定产品,所有其他谓词都可以跳过。因为我使用了< code>findFirst,所以对于所有其他

  • 我必须通过一个映射过滤对象集合,该映射包含对象字段名和字段值的键值对。我正在尝试按stream()应用所有过滤器。过滤器()。 对象实际上是JSON,因此映射包含其变量的名称以及它们必须包含的值,以便被接受,但出于简单的原因,并且由于与问题无关,我编写了一个简单的Testclass来模拟行为: 到目前为止我所尝试的: 我试着将地图的每个部分放在第一位,将集合的流放在第一位,但这两种解决方案都没有按

  • 问题内容: 有时你想过滤具有多个条件的a: 或者你可以做同样的复杂条件和单 filter: 我的猜测是第二种方法具有更好的性能特征,但我不知道。 第一种方法赢得了可读性,但是哪种性能更好? 问题答案: 两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。 组合两个过滤器

  • 问题内容: 为了调试目的,我想在处理输出流时将其内容转储到文件中。解析流将使用该流。 我可能会需要一个过滤器来存档它,在写我自己之前,我想问一下是否已经有现成的版本。 更新: 应该提到我在Android上工作。 我有什么: 所以我有一个和一个。 问题答案: 并不完全是准备推出一个,但是这可能会感兴趣。示例中有一个TeeOutputStream实现。

  • 问题内容: 我想在一个实体上使用多个Hibernate过滤器,我尝试了所有没有失败的逻辑,Google以及Hibernate文档都对此提出了不足。我无法想象这是不可能的。(使用Java 6 Hibernate 4.1.9.final) 目前,我有这个: 我想向Testcase类添加第二个独立过滤器。我所追求的是这样的: 这是我尝试过的 我试图像这样向TestCase添加多个@FilterDefs,

  • 问题内容: 我必须通过一个映射过滤一个对象集合,该映射包含对象字段名称和字段值的键值对。我试图通过stream()。filter()应用所有过滤器。 对象实际上是JSON,因此Map保留了其变量的名称以及它们必须包含的值才能被接受,但是出于简单性的原因,并且由于它与问题无关,因此我编写了一个简单的Testclass来模拟行为: 到目前为止我尝试过的是: 我尝试将Map的forEach放在首位,并将