gpt4 book ai didi

java - 在 Java 8 中是否有一种优雅的方法来应用过滤器数组?

转载 作者:搜寻专家 更新时间:2023-11-01 04:05:32 24 4
gpt4 key购买 nike

有没有一种方法可以使用 reduce 或类似的方法将过滤器数组应用于对象数组?

现在,我有这个:

private void applyManyFilters(long[] initialData, LongPredicate... filters) {
LongStream stream = Arrays.stream(initialData);
for (LongPredicate filter : filters) {
stream = stream.filter(filter);
}
long[] dataToUse = stream.toArray();

// Use filtered data
}

一个更优雅的解决方案看起来像这样:

private void applyManyFilters(long[] initialData, LongPredicate... filters) {
long[] dataToUse = Arrays.stream(filters).reduce(Arrays.stream(initialData), (a, b) -> a.filter(b)).toArray();

// Use filtered data here
}

当然,上面的示例无法编译,因为 reduce 的两个参数都需要是 LongPredicate,而不是 LongStream。我很好奇上面的代码能不能写成一行?

(P.S. 需要说明的是,这是一个关于 Java 8 如何工作的问题,而不是关于风格的问题。我同意单行方法不如循环可读。)

最佳答案

我相信这就是您要找的:

private void applyManyFilters(long[] initialData, LongPredicate... filters) {
long[] dataToUse = Arrays.stream(initialData)
.filter(v -> Arrays.stream(filters)
.allMatch(f -> f.test(v)))
.toArray();
// Use filtered data
}

更新

合并其他两个答案,您还可以创建一个辅助方法来组合一组过滤器。您可以在帮助程序类中将其作为一个很好的实用方法,以便在您的代码中的任何地方重用,以及覆盖其他谓词(BiPredicateDoublePredicateIntPredicatePredicate)。

private void applyManyFilters(long[] initialData, LongPredicate... filters) {
long[] dataToUse = Arrays.stream(initialData)
.filter(combine(filters))
.toArray();
// Use filtered data
}
public static LongPredicate combine(LongPredicate... filters) {
return Arrays.stream(filters)
.reduce(LongPredicate::and)
.orElse(x -> true);
}

关于java - 在 Java 8 中是否有一种优雅的方法来应用过滤器数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39538615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com