比方说,我有以下要素:
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 的流”,我不相信可以在“流的另一点”检索数据。
您有一种优雅的方式来完成上述操作吗?
您可以自己创建
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();