Java 8,如何从(Bi)谓词组成(Bi)函数

时间:2017-08-23 17:45:42

标签: java java-8

我不相信这个问题特定于这些Java 8类的Bi版本,因此问题标题中的问题。

我创建了一个函数来创建一个具有以下要求的Apache Commons Lang3 Pair对象:

  1. 如果Left和Right都为null,则Pair应为null
  2. 如果Left和Right彼此相等,那么Pair应为null
  3. 否则,应创建一对,其中任何一方可能为空
  4. 我在以下方法中做到了这一点:

    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个问题:

    1. 有没有办法避免2 BiPredicates?仅需要第二个,因为BiFunction内部的引用要求它为final
    2. 有没有办法将其移出方法并进入周围的类?
    3. 我错过了明显的“清理”吗?
    4. 更新

      根据以下答案之一,没有任何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);
      

2 个答案:

答案 0 :(得分:3)

Objects.equals()方法的空安全处理将在这里清理。

就个人而言,我把它放在辅助函数中。您可以在功能上将其用作整洁的方法参考,或者只是将其称为方法。

static Pair<String, String> toPair(String pre, String post) {
  return Objects.equals(pre, post) ? null : ImmutablePair.of(pre, post);
}

答案 1 :(得分:0)

您可以加入谓词:

BiPredicate<String,String> valuesExist = (pre, post) -> (pre != null || post != null) && ((pre == null) || !pre.equals(post));
BiFunction<String, String, Pair<String,String>> createPair =
        (pre, post) -> (valuesExist.test(pre, post)) ?
                new Pair<>(pre, post) : null;

我个人会改为创建2个方法/函数:

boolean filterPairArgs(String pre, String post) {
    return (pre != null || post != null) && ((pre == null) || !pre.equals(post));
}

Pair<String, String> createPair(String v1, String v2, BiPredicate<String, String> pred) {
    if(pred.test(v1, v2)) {
        return new Pair<>(v1, v2);
    } 
    return null;
}

// usage looks like:
Pair<String, String> myPair = createPair(myValue1, myValue2, this::filterPairArgs);