Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8,如何从(Bi)谓词组合(Bi)函数_Java_Java 8 - Fatal编程技术网

Java8,如何从(Bi)谓词组合(Bi)函数

Java8,如何从(Bi)谓词组合(Bi)函数,java,java-8,Java,Java 8,我不相信这个问题是特定于这些Java8类的Bi版本的,因此问题标题中有paren 我编写了一个函数来创建一个具有以下要求的Apache Commons Lang3对对象: 如果左侧和右侧都为null,则该对应为null 如果Left和Right彼此相等,则该对应为null 否则,应创建一对,其任意一侧都可能为空 我采用了如下方法: BiPredicate<String,String> valuesExist = (pre, post) -> pre != null || pos

我不相信这个问题是特定于这些Java8类的
Bi
版本的,因此问题标题中有paren

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

  • 如果左侧和右侧都为null,则该对应为null
  • 如果Left和Right彼此相等,则该对应为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)              
    

    您可以加入谓词:

    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;
    
    BiPredicate valuesExist=(pre,post)->(pre!=null | | post!=null)&((pre==null)| |!pre.equals(post));
    双功能创建对=
    (前,后)->(值性别歧视测试(前,后))?
    新对(前、后):空;
    
    就我个人而言,我将创建两种方法/函数:

    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);
    
    boolean filterPairArgs(字符串前置、字符串后置){
    返回(pre!=null | | post!=null)&((pre==null)| |!pre.equals(post));
    }
    对createPair(字符串v1、字符串v2、双预测pred){
    if(预测试(v1,v2)){
    返回新的对(v1,v2);
    } 
    返回null;
    }
    //用法如下所示:
    Pair myPair=createPair(myValue1,myValue2,this::filterPairArgs);
    
    方法的空安全处理将清理这里的问题

    就我个人而言,我会把它放在一个助手函数中。您可以在功能上将其用作整洁的方法引用,也可以简单地将其称为方法

    static Pair<String, String> toPair(String pre, String post) {
      return Objects.equals(pre, post) ? null : ImmutablePair.of(pre, post);
    }
    
    静态对toPair(字符串前置、字符串后置){
    返回Objects.equals(pre,post)?null:ImmutablePair.of(pre,post);
    }
    
    将这两种方法更改为“静态”方法将进一步简化—甚至可以删除所有Java-8残留—否?对于静态方法,您将使用静态方法引用,这是Java 8的一个特性。决定是否将它们设置为静态需要更多的上下文。我把那个留给你。请记住,当您创建双函数和双预测时,您正在创建需要进行垃圾收集的对象。更新了我的问题,以更好地反映我的想法。谓词可以大大简化为
    (a,b)->对象。等于(a,b)?null:ImmutablePair.of(a,b)
    。我不知道你为什么要用作文。是的,这看起来很棒!我想它也可以返回一个
    可选的
    ,这取决于调用者的工作方式。当传递2个空值时,它会返回
    ImmutablePar.of(null,null)
    。@Arkadiy不,不会。@Arkadiy没问题。我习惯于对一切事物进行负面比较(有点像
    NaN
    ),所以这有点违反直觉,但很方便。
    static Pair<String, String> toPair(String pre, String post) {
      return Objects.equals(pre, post) ? null : ImmutablePair.of(pre, post);
    }