Java 8 java 8方法引用:equals或equalsIgnoreCase`

Java 8 java 8方法引用:equals或equalsIgnoreCase`,java-8,java-stream,method-reference,Java 8,Java Stream,Method Reference,我试图转换方法体boolean exists(字符串值,boolean isCaseSensitive): 对于使用java8方法的解决方案,请参考: Predicate<String> equalityPred = isCaseSensitive ? name::equals : name::equalsIgnoreCase; return existingNames.stream().anyMatch(equa

我试图转换方法体
boolean exists(字符串值,boolean isCaseSensitive)

对于使用java8方法的解决方案,请参考:

    Predicate<String> equalityPred = isCaseSensitive ? 
            name::equals : 
            name::equalsIgnoreCase;

    return existingNames.stream().anyMatch(equalityPred);
谓词equalityPred=isCaseSensitive?
名称::等于:
名称::equalsIgnoreCase;
返回existingNames.stream().anyMatch(equalityPred);
然后我看到,通过这种方式,等式是以相反的方向执行的(例如,
value.equals(str)
)。

有没有一种方法可以解决这个问题,并且仍然使用方法引用,如果没有,那么java8的方法是什么。

那么不要使用方法引用,直接编写lambda:

     static boolean existsJDK8(List<String> existingNames, String value, boolean isCaseSensitive) {
         Predicate<String> equalityPred = isCaseSensitive ? s -> value.equals(s) : s -> value.equalsIgnoreCase(s);

         Predicate<String> equalityPredReversed = isCaseSensitive ? s -> s.equals(value) : s -> s.equalsIgnoreCase(value);

         // return  existingNames.stream().anyMatch(equalityPredReversed);
        return existingNames.stream().anyMatch(equalityPred);
     }
static boolean existsJDK8(列出现有名称、字符串值、boolean isCaseSensitive){
谓词equalityPred=isCaseSensitive?s->value.equals(s):s->value.equalsIgnoreCase(s);
谓词equalityPredReversed=isCaseSensitive?s->s.equals(值):s->s.equalsIgnoreCase(值);
//返回existingNames.stream().anyMatch(equalityPredReversed);
返回existingNames.stream().anyMatch(equalityPred);
}

平等没有“相反方向”。唯一的问题可能是
null
值的行为。循环可能会失败,如果集合包含
null
,则方法引用将失败,如果
name
null

可以使用lambda表达式实现原始行为:

boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
    Predicate<String> equalityPred = isCaseSensitive? 
        s -> s.equals(name): 
        s -> s.equalsIgnoreCase(name);

    return existingNames.stream().anyMatch(equalityPred);
}
或者只是

boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
    return name==null || isCaseSensitive?
        existingNames.contains(name):
        existingNames.stream().anyMatch(name::equalsIgnoreCase);
}

拥有
str.equals(value)
value.equals(str)
有什么问题?基本上,如果这两个值中有一个为真,那么另一个也必须为真。@Ousmane Mahy Diaw一种可能的情况是,该方法接受空值,但集合永远不会包含任何值。
boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
    Predicate<String> equalityPred = name==null? Objects::isNull:
        isCaseSensitive? name::equals: name::equalsIgnoreCase;

    return existingNames.stream().anyMatch(equalityPred);
}
boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
    return name==null || isCaseSensitive?
        existingNames.contains(name):
        existingNames.stream().anyMatch(name::equalsIgnoreCase);
}
boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
    return name!=null && existingNames.stream()
        .anyMatch(isCaseSensitive? name::equals: name::equalsIgnoreCase);
}