Mar*_* An 3 java-8 java-stream method-reference
我试图转换方法的主体boolean exists(String value, boolean isCaseSensitive):
for(String str : existingNames){
if(isCaseSensitive ? str.equals(name) : str.equalsIgnoreCase(name)){
return true;
}
}
return false;
Run Code Online (Sandbox Code Playgroud)
到使用java8方法引用的解决方案:
Predicate<String> equalityPred = isCaseSensitive ?
name::equals :
name::equalsIgnoreCase;
return existingNames.stream().anyMatch(equalityPred);
Run Code Online (Sandbox Code Playgroud)
然后我看到这种方式在相反的方向上执行相等(例如value.equals(str)).
有没有办法解决这个问题,仍然使用方法引用,如果没有什么是java8方式.
平等没有"相反的方向".唯一的问题可能是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);
}
Run Code Online (Sandbox Code Playgroud)
但它意义不大考虑null的name参数,当它永远不会是平等的,因为代码将与失败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);
}
Run Code Online (Sandbox Code Playgroud)
要不就
boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
return name==null || isCaseSensitive?
existingNames.contains(name):
existingNames.stream().anyMatch(name::equalsIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
如果您知道该集合永远不会包含null,但要支持null的name参数,你也可以使用
boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) {
return name!=null && existingNames.stream()
.anyMatch(isCaseSensitive? name::equals: name::equalsIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6421 次 |
| 最近记录: |