查看 Java 流(或组合函数)不同阶段的数据

问题描述 投票:0回答:1

比方说,我有以下要素:

class A {
    String s;

    String getS() {return s;}

    static boolean aFilter(String in) {return true or false}

    static A aTransformation(A a) {return another A}
}

我想用 Java 流执行以下操作:

List<A> myAs = provideTheList();

myAs.stream()
    .map(A::getS)
    .filter(A::aFilter)
    .map("back to stream of A")
    .map(A::aTransformation)
    .toList();

我知道我可以这样做:

myAs.stream()
    .filter(a -> A.aFilter(a.getS()))
    .map(A::aTransformation)
    .toList();

但是它打破了代码作为一系列转换的表达。我想避免“a -> ...”。我可以编写一个函数来执行“A.aFilter(a.getS())”,但上面的模式很常见,为此编写额外的函数很麻烦。比如:

myAs.stream()
    .filter(A::aFilter ° A::getS) // function composition
    ...

就完美了,但是我不知道是否可以用Java来表达函数组合。

在 Java 中,我们有可以用 and、or 组合的谓词。

我没有找到在流中组合函数的方法。

另一种方法是“返回 A 的流”,我不相信可以在“流的另一点”检索数据。

您有一种优雅的方式来完成上述操作吗?

java function stream composition
1个回答
0
投票

您可以自己创建

static <T, U> Predicate<T> combine(Function<T, U> f, Predicate<U> p) {
    return (T t) -> p.test(f.apply(t));
}

并将其用作

Stream.of(X.builder().build())
    .filter(combine(X::getS, String::isBlank))
    .toList();
© www.soinside.com 2019 - 2024. All rights reserved.