我试图创建一个函数,该函数接受多个谓词条件,并根据这些条件过滤流。我找不到任何东西,但我的retList似乎只是由输入组成,而不是输入的过滤版本。
以下是给我的指示:
//要生成一个整数流,并将其设置为每个谓词p的输入,请将此流变量设置为对流应用过滤器(p)的结果。完成for-each循环后,像我们在前面的问题中所做的那样,将结果流收集到一个列表中,返回结果列表
这是我目前拥有的:
public static List<Integer> matchAll(Stream<Integer> input, Predicate<Integer>... conditions) {
Stream<Integer> stream = input;
Stream.of(conditions).peek(p -> stream.filter(p));
List<Integer> retList = stream.collect(Collectors.toList());
return retList;
}
这就是它的测试方式:
public static void main(String[] args) {
Stream<Integer> stream = Stream.of(5,7,9,11,13,14,21,28,35,42,49,56,63,70,71);
Predicate<Integer> p0 = n -> n > 10;
Predicate<Integer> p1 = n -> n % 2 != 0;
Predicate<Integer> p2 = n -> isPrime(n);
System.out.println(Matcher.matchAll(stream, p0, p1, p2));
// should get [11, 13, 71]
}
但我实际得到的是[5,7,9,11,13,14,21,28,35,42,49,56,63,70,71],输入。
在当前的实现中,您没有将过滤的“结果”存储在任何地方。filter方法不会修改原始流,原始流是不可变的,但会返回一个仅包含原始流中匹配值的新流。
实现这一点的一种方法是循环遍历您的条件,用包含应用过滤的新流替换以前的流:
public static List<Integer> matchAll(Stream<Integer> input, Predicate<Integer>... conditions) {
Stream<Integer> stream = input;
for (Predicate<Integer> condition : conditions) {
stream = stream.filter(condition);
}
return stream.collect(Collectors.toList());
}
您只需在您的matchAll方法中创建一个复合谓词,并使用它过滤输入流,如下所示:
public static List<Integer> matchAll(Stream<Integer> input, Predicate<Integer>... conditions) {
Predicate<Integer> compositePredicate =
Arrays.stream(conditions).reduce(Predicate::and).orElse(p -> true); // or else filter in all
return input.filter(compositePredicate).collect(Collectors.toList());
}
根据霍尔格的建议,您也可以使用:
return Arrays.stream(conditions)
.reduce(Predicate::and)
.map(input::filter) // Optional.map here
.orElse(input)
.collect(Collectors.toList()); // terminal operation
试试吧
public static List<Integer> matchAll(List<Integer> input, Predicate<Integer>... conditions) {
Stream<Integer> streams = input.stream();
for (Predicate<Integer> predicate : conditions) {
streams = streams.filter(predicate);
}
return streams.collect(Collectors.toList());
}
public static void main(String[] args) {
List<Integer> list = Arrays.asList(5, 7, 9, 11, 13, 14, 21, 28, 35, 42, 49, 56, 63, 70, 71);
Predicate<Integer> p0 = n -> n > 10;
Predicate<Integer> p1 = n -> n % 2 != 0;
Predicate<Integer> p2 = n -> isPrime(n);
System.out.println(matchAll(list, p0, p1, p2)); // [11, 13, 71]
}
我在这里看到:https://stackoverflow.com/a/51187234/10910098
问题内容: 我正在尝试使用Pandas在几个条件下进行布尔索引。我原来的DataFrame称为。如果执行以下操作,将得到预期的结果: 但是,如果我这样做(我认为应该是等效的),则不会返回任何行: 知道导致差异的原因是什么? 问题答案: 使用是因为运算符优先级: 或者,在单独的行上创建条件: 样品 :
问题内容: 我想像这样做一个ElasticSearch查询: 我试图像这样在NEST中实现它: 但这给了我这样的查询,其中的过滤器包装在 布尔值中 : 我应该如何更改我的NEST代码以提供正确的查询?是否必须将我的条款添加到 QueryContainer之外的 其他项目中? 问题答案: 如果要检查条件过滤器,可以在查询之前创建过滤器列表,如下所示: 如果在进行过滤器查询之前不需要检查任何条件,则可
问题内容: 谁能向我解释为什么我对这两个表达式会得到不同的结果?我正在尝试在2个日期之间进行过滤: 结果:37M 与 结果:25M 它们有何不同?在我看来,他们应该产生相同的结果 问题答案: TL; DR 要传递多个条件或使用对象和逻辑运算符(,,)。请参见Pyspark:when子句中的多个条件。 您还可以使用 单个 SQL字符串: 实际上,在以下两者之间使用更有意义: 第一种方法甚至不是远程有
问题内容: 有时你想过滤具有多个条件的a: 或者你可以做同样的复杂条件和单 filter: 我的猜测是第二种方法具有更好的性能特征,但我不知道。 第一种方法赢得了可读性,但是哪种性能更好? 问题答案: 两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。 组合两个过滤器
问题内容: 这是我的config.json: 这是我的bash命令: 输出: 因此$ PRJNAME是prj1,但是第一次调用仅输出。 有人能帮我吗? 问题答案: 您的示例中的jq程序实际上会尝试查找名为的键。请尝试以下操作:
问题内容: 是否可以将参数传递给filter函数,以便您可以按任何名称进行过滤? 就像是 问题答案: 实际上,还有另一种(也许是更好的解决方案),您可以使用angular的本机“过滤器”过滤器,并且仍将参数传递给自定义过滤器。 考虑以下代码: 要进行此工作,您只需将过滤器定义如下: 如您在这里看到的,weDontLike实际上返回另一个函数,该函数的范围内有您的参数以及来自过滤器的原始项。 我花了