Ari*_*EVE 0 java lambda java-8 java-stream
用java 8 stream()重写这个迭代的最佳方法是什么.
for (name : names){
if(name == a){
doSomething();
break;
}
if(name == b){
doSomethingElse();
break;
}
if(name == c){
doSomethingElseElse();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果满足其中任何条件,则在3个条件下迭代列表,想要打破循环,并且在每个条件中都想调用不同的方法.
您可以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;
}
}
);
Run Code Online (Sandbox Code Playgroud)
非常难看,但是你在一次迭代中做了什么.
Eran的答案绝对是执行搜索的直接方法。但是,我想提出一种稍微不同的方法:
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() {
}
Run Code Online (Sandbox Code Playgroud)
,没有工作的部分是下面的代码,但我把它添加到一个main()函数假设a,b和c都是字符串。但是,该想法适用于任何数据类型。
names.stream()
.filter(stringToRunnable::containsKey)
.findFirst()
.ifPresent(name -> stringToRunnable.get(name).run());
Run Code Online (Sandbox Code Playgroud)
这个想法是保持键和Runnables 的映射。通过具有Runnable值,可以定义不带参数的void方法引用。流首先过滤掉地图中不存在的所有值,然后找到第一个匹配项,并在找到后执行其方法。
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |