我不认为这个问题特定于这些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);
}

09-11 18:34
查看更多