java 8 个方法引用:`equals` 或 `equalsIgnoreCase`
java 8 method reference to: either `equals` or `equalsIgnoreCase`
我尝试转换方法的主体 boolean exists(String value, boolean isCaseSensitive)
:
for(String str : existingNames){
if(isCaseSensitive ? str.equals(name) : str.equalsIgnoreCase(name)){
return true;
}
}
return false;
使用 java8 方法参考的解决方案:
Predicate<String> equalityPred = isCaseSensitive ?
name::equals :
name::equalsIgnoreCase;
return 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);
}
平等没有“反方向”。唯一的问题可能是 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);
}
但是对于 name
参数考虑 null
没有什么意义,因为它永远不会相等,因为代码将失败并显示 NullPointerException
,如果集合包含null
.
要获得 null
的合理行为,您可以使用
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);
}
如果您知道该集合永远不会包含 null
,但希望支持 null
作为 name
参数,您也可以使用
boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
return name!=null && existingNames.stream()
.anyMatch(isCaseSensitive? name::equals: name::equalsIgnoreCase);
}
我尝试转换方法的主体 boolean exists(String value, boolean isCaseSensitive)
:
for(String str : existingNames){
if(isCaseSensitive ? str.equals(name) : str.equalsIgnoreCase(name)){
return true;
}
}
return false;
使用 java8 方法参考的解决方案:
Predicate<String> equalityPred = isCaseSensitive ?
name::equals :
name::equalsIgnoreCase;
return 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);
}
平等没有“反方向”。唯一的问题可能是 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);
}
但是对于 name
参数考虑 null
没有什么意义,因为它永远不会相等,因为代码将失败并显示 NullPointerException
,如果集合包含null
.
要获得 null
的合理行为,您可以使用
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);
}
如果您知道该集合永远不会包含 null
,但希望支持 null
作为 name
参数,您也可以使用
boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
return name!=null && existingNames.stream()
.anyMatch(isCaseSensitive? name::equals: name::equalsIgnoreCase);
}