使用java 8 stream()重写此迭代的最佳方法是什么。
for (name : names){
if(name == a){
doSomething();
break;
}
if(name == b){
doSomethingElse();
break;
}
if(name == c){
doSomethingElseElse();
break;
}
}
基本上,如果满足任何条件,则迭代3个条件的列表想要打破循环,并且在每个条件中都想调用不同的方法。
答案 0 :(得分:5)
您可以使用anyMatch
查找与您的某个条件匹配的第一个元素并终止。使用副作用调用处理方法:
boolean found =
names.stream()
.anyMatch (name -> {
if (name.equals(a)) {
doSomething();
return true;
} else if (name.equals(b)) {
doSomethingElse ();
return true;
} else if (name.equals(c)) {
doSomethingElseElse ();
return true;
} else {
return false;
}
}
);
非常难看,但是你在一次迭代中做了什么。
答案 1 :(得分:5)
this step绝对是执行搜索的直接方式。但是,我想提出一个稍微不同的方法:
private static final Map<String, Runnable> stringToRunnable = new HashMap<>();
{
stringToRunnable.put("a", this::doSomething);
stringToRunnable.put("b", this::doSomethingElse);
stringToRunnable.put("c", this::doSomethingElseElse);
}
public static void main(String[] args) {
List<String> names = Arrays.asList("1", "2", "b", "a");
names.stream()
.filter(stringToRunnable::containsKey)
.findFirst()
.ifPresent(name -> stringToRunnable.get(name).run());
}
private void doSomethingElseElse() {
}
private void doSomethingElse() {
}
public void doSomething() {
}
执行此任务的部分是下面的代码,但我将其添加到main()
函数,假设a
,b
和c
是字符串。但是,这个想法适用于任何数据类型。
names.stream()
.filter(stringToRunnable::containsKey)
.findFirst()
.ifPresent(name -> stringToRunnable.get(name).run());
我们的想法是保留密钥和The answer by Eran的映射。通过将Runnable
作为值,可以定义不带参数的void方法引用。流首先过滤掉地图中不存在的所有值,然后找到第一个匹配,并在找到时执行其方法。
答案 2 :(得分:-2)
Collection collection;
collection.forEach(name->{
if(name.equals(a))){
doSomething();
}
if(name.equals(b)){
doSomethingElse();
}
if(name.equals(c)){
doSomethingElseElse();
}
});