如何在Java中反转或补充返回布尔值的函数的输出

如何在Java中反转或补充返回布尔值的函数的输出,java,apache-spark,functional-programming,Java,Apache Spark,Functional Programming,我正在用java编写一个spark代码,需要将数据集分成两部分。基于某种条件 FilterFunction<Row> cond = (Row row) -> { return true; } Dataset<Row> part1 = originalDs.filter(cond ); //This part is easy Dataset<Row> part2 = originalDs.filter(!cond ); //This part is my

我正在用java编写一个spark代码,需要将数据集分成两部分。基于某种条件

FilterFunction<Row> cond = (Row row) -> {
return true;
}

Dataset<Row> part1 = originalDs.filter(cond ); //This part is easy
Dataset<Row> part2 = originalDs.filter(!cond ); //This part is my problem . Doesn't work
FilterFunction cond=(行)->{
返回true;
}
数据集第1部分=原始数据过滤器(cond)//这部分很简单
数据集第2部分=原始的.filter(!cond)//这部分是我的问题。不起作用
现在很明显,我可以编写另一个返回
false
的过滤函数,但是内部逻辑很复杂,我不想重写相同的逻辑,也不想使用相同的过滤函数

java中有没有一种方法可以包装这个函数,并在某种程度上输出补码?

您可以使用这样的函数

Dataset<Row> part1 = originalDs.filter(cond);
Dataset<Row> part2 = originalDs.except(part1);
Dataset part1=originalDs.filter(cond);
数据集第2部分=原始数据(第1部分除外);
不过这里有一个问题-
,除了
之外,它还执行不同的,这在某些情况下可能有用(或至少无害),但在其他情况下可能不有用。

数据集part1=originalDs.filter(cond);
Dataset<Row> part1 = originalDs.filter(cond);
Dataset<Row> part2 = originalDs.join(part1, "uniqColOrPrimarykey", "leftanti");
Dataset part2=originalDs.join(part1,“uniqColOrPrimarykey”、“leftanti”);
如果必须修改
第1部分
架构,则
除外
将不起作用。但是左反连接总是有效的


Left anti-join基本上保留了左侧的行,而右侧没有,因此正确地命名为
anti

需要将数据集分成两部分=>
收集器::Partitioning By
谢谢。这是个好建议。但是我也想知道这个解决方案,在scala中,我们可以使用
而不是functionname
作为lambda。如何在java中做到这一点?
Predicate::not
,因为java-11或像
a->一样简单!(无论您的条件如何)
:(…仍在java-8上,使用该
?您始终可以从
谓词::not
获取代码,将其导入实用程序并使用它。但感谢@Grisha。您的回答最终导致了我的解决方案