Java8,如何从(Bi)谓词组合(Bi)函数
我不相信这个问题是特定于这些Java8类的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
Bi
版本的,因此问题标题中有paren
我编写了一个函数来创建一个具有以下要求的Apache Commons Lang3对对象:
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);
}