我不认为这个问题特定于这些Java 8类的Bi
版本,因此请不要在问题标题中使用。
我编写了一个函数,以创建具有以下要求的Apache Commons Lang3 Pair
对象:
如果Left和Right都为null,则Pair应该为null
如果Left和Right彼此相等,则Pair应该为null
否则,应创建一个对,其任一侧都可以为null
我在以下方法中执行此操作:
BiPredicate<String,String> valuesExist = (pre, post) -> pre != null || post != null;
final BiPredicate<String, String> valuesDiffer = valuesExist.and((pre, post) ->
(pre != null) ? ! pre.equals(post) : true);
BiFunction<String, String, Pair<String,String>> createPair =
(pre, post) -> (valuesDiffer.test(pre, post)) ?
ImmutablePair.of(pre, post) : null;
// usage looks like:
Pair<String, String> myPair = createPair.apply(myValue1, myValue2)
我有3个问题:
有没有办法避免两个BiPredicates?仅需要第二个,因为在BiFunction内部进行引用要求它为
final
有没有办法将其移出方法并移至周围的类中?
我错过了明显的“清理”吗?
更新资料
根据以下答案之一,一种不具有任何Java-8功能的解决方案似乎也是可行的:
static boolean filterPairArgs(String pre, String post) {
return (pre != null || post != null) && ((pre == null) || !pre.equals(post));
}
static Pair<String, String> createPair(String v1, String v2) {
if (filterPairArgs(v1, v2)) {
return new Pair<>(v1, v2);
}
return null;
}
// usage looks like:
Pair<String, String> myPair = createPair(myValue1, myValue2);
最佳答案
Objects.equals()方法的null安全处理将在此处进行清理。
就个人而言,我会将其放在辅助函数中。您可以在功能上将其用作整洁的方法引用,也可以简单地将其称为方法。
static Pair<String, String> toPair(String pre, String post) {
return Objects.equals(pre, post) ? null : ImmutablePair.of(pre, post);
}