我被困在为进行函数式编程而做的一项练习中,所以我的主要问题是如何对集合元素中传递的谓词进行计数,以及是否符合给定的阈值而不是将其收集到最终集合中。

我知道如何做到无极限,这是我的解决方案:

List<String> filter(List<Predicate<String>> predicateList, List<String> stringList) {
    return stringList.stream()
                     .filter(predicateList.stream()
                                          .reduce(x -> !(x.isEmpty()), Predicate::and))
                     .collect(Collectors.toList());
}

但是,当有参数确定要传递多少谓词以收集字符串时,我该怎么办,假设方法的主体看起来像这样:

List<String> filtrr(List<Predicate<String>> predicateList, List<String> stringList, Double threshold) {}

编辑:例如方法应通过单元测试,如下所示:

@Test
void filtrrTest() {
    Double threshold = 0.65;

    Predicate<String> predicate = p -> p.contains("lorem");
    Predicate<String> predicate1 = p -> p.length() > 10;
    Predicate<String> predicate2 = p -> p.contains("sed");

    List<Predicate<String>> predicateList = Arrays.asList(predicate, predicate1, predicate2);

    String string = "lorem ipsum dolor sit amet sed";
    String string1 = "consectetur adipiscing elit, sed do eiusmod";
    String string2 = "ipsum";
    String string3 = "adipiscing elit";
    String string4 = "sed do eiusmod";

    List<String> stringList = Arrays.asList(string, string1, string2, string3, string4);
    List<String> expectedList = Arrays.asList(string, string1, string4);

    assertEquals(expectedList, ClassName.filtrr(predicateList, stringList, threshold));
}

#1楼 票数:2 已采纳

首先,我将创建一个通用实用程序方法,该方法检查给定元素是否匹配谓词的threshold %

public static <T> boolean matchingSome(
        T elem, 
        List<Predicate<T>> predicates, 
        double threshold) {

    long predsToMatch = (long) ((double) predicates.size() * threshold);

    long predsMatched = predicates.stream()
        .filter(p -> p.test(elem))
        .limit(predsToMatch) // this limit is to short-circuit as soon as
        .count();            // predsToMatch predicates evaluate to true

    return predsMatched == predsToMatch;
}

请注意,一旦predsToMatch谓词评估为true ,我就会使流短路。 这是为了避免继续评估其他谓词。

现在,只需收集上述方法返回true所有字符串:

List<String> result = stringList.stream()
    .filter(s -> matchingSome(s, predicateList, threshold))
    .collect(Collectors.toList());

  ask by saturator22 translate from so

未解决问题?本站智能推荐:

3回复

Java如何比较谓词

我有两个建议: 使用 and if 语句,我如何确定我使用的是哪个谓词? 我正在尝试做这样的事情,但显然没有编译: 任何提示? 我对 Java 8 lambdas 很陌生 这是 Pojos 的代码(用于测试目的的简单继承):
4回复

如何将多个谓词应用于java.util.Stream?

如何将多个谓词应用于java.util.Stream's filter()方法? 这就是我现在所做的,但我并不喜欢它。 我Collection了一些东西,我需要根据过滤器Collection (谓词)减少事物的数量: 我知道如果我事先了解过滤器的数量,我可以这样做: 但是
2回复

如何组合List中的所有谓词 >

我有一个问题,我相信你帮我解决了皱纹问题。 我有 我想在这里使用这些谓词 作为一个谓词合并如下: 我有一个表(13列),其中包含一些结果(在JavaFx中)和6个字段,可以通过这些字段中的值在此表中搜索。 我只能输入3个字段的值,所以我的 问题是如何最好地
2回复

如何从Java的自定义谓词列表中创建谓词?

我对编程比较陌生,过去两天我一直想知道如何制作一个由其他Predicates自定义列表组成的谓词。 所以我想出了一些解决方案。 下面是一个代码片段,可以给你一个想法。 因为我是基于单独阅读各种文档而编写的,所以我有两个问题:1 /它是一个很好的解决方案吗? 2 /是否有其他一些推荐的解决
2回复

如何迭代谓词列表

我有一个 spring boot 应用程序,我们有一个带有一组功能标志的 application.yml 然后这个文件被一个这个类读取 我想传递实际的谓词并迭代它们中的每一个,但我想知道我是否可以做一个通用函数,我将传递带有要测试的值的谓词列表,如果所有这些都为真,则该函数返回给我一个真否则
2回复

使用谓词验证搜索参数

我有一个validate()方法,它检查在rest url中传递的参数。 参数链接到如下所示的模型类 我有一个实用程序类,用于检查参数是否已设置。 我有一个谓词,它根据util中提供的条件进行测试,并生成一个真值字符串 现在,基于参数set / notset,regno
3回复

使用 Java 8 Predicates 改进代码 - 比较多个参数

我不确定我有正确的标题。 我想对请求执行一些验证。 我在现有代码的很多地方都有这个条件测试。 它位于实用程序类中。 该方法是DoesRequestLineFallsWithinDateRange(object)。 我想知道我是否可以通过使用谓词并停用该方法来改进代码并在 Java 8 中更加优雅。
2回复

根据独立谓词流式传输一个集合并收集到多个结果中

我盯着一些命令式代码,我试图将其转换为纯函数式风格。 基本上,在inputSet有一个迭代 for 循环,其中我检查 3 个谓词并根据哪个谓词匹配来填充 3 个outputSets 。 输出集可以重叠。 如何使用 Java 8 流/映射/过滤器/等以纯函数方式执行此操作?