将嵌套循环转换为Java8流
我有以下嵌套for循环,需要将其转换为声明性代码将嵌套循环转换为Java8流,java,for-loop,java-8,Java,For Loop,Java 8,我有以下嵌套for循环,需要将其转换为声明性代码 for (String variable : variables ){ boolean validAttribute = false; if(variable.equals(SOME_CONSTANT)){ validAttribute = true; } else { for(String attrName: attrNames){ i
for (String variable : variables ){
boolean validAttribute = false;
if(variable.equals(SOME_CONSTANT)){
validAttribute = true;
}
else {
for(String attrName: attrNames){
if(variableName.equals(attrName)){
validAttribute = true;
break;
}
}
}
if(!validAttribute){
return false;
}
}
我能够通过使用flatMap
实现它。但是,与前面的for循环相比,在第一个不匹配的条目处中断似乎效率不高。还有其他更简单的方法吗
(下面的代码似乎很难理解)
List inValidVariables=attrNames.stream().flatMap(attrName->variableNames.stream())
.filter(variableName->!variableName.equals(attrName)&&!variableName.equals(某些常量)))
.collect(Collectors.toList());
返回inValidVariables.size()==0;
我认为这应该符合您的要求:
variables.stream().noneMatch(variable-> !variable.equals(CONSTANT)&&attrNames.stream().noneMatch(attrName -> variable.equals(attrName)));
如果每个变量等于常量或属性名之一,则返回true
否则它返回
false
(如果有任何变量与常量或属性名不匹配)我个人会这样解决这个问题
variables.stream().allMatch((item) -> item.equals(SOME_CONSTANT)
|| attrNames.contains(item));
我认为streams应该使您的任务更简单,而不是更复杂,这就是为什么我没有将其用于内部循环的原因,因为您可以重构它
这里是ideone,您可以运行这两种方法您不能用
variable->stuff
代替variable->{return stuff;}
?我更喜欢您的答案(我认为很复杂),而且我使用的streams api没有那么长。但是并行流不会使它(更快吗?)吗?@griFlo我不知道,我昨天开始研究java8:)谢谢,满足了我的期望。
variables.stream().allMatch((item) -> item.equals(SOME_CONSTANT)
|| attrNames.contains(item));