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);
}