在java 8中使用流迭代列表

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个条件下迭代列表,想要打破循环,并且在每个条件中都想调用不同的方法.

Era*_*ran 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;
                  }
                }
              );
Run Code Online (Sandbox Code Playgroud)

非常难看,但是你在一次迭代中做了什么.


Mag*_*lex 5

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()函数假设abc都是字符串。但是,该想法适用于任何数据类型。

names.stream()
    .filter(stringToRunnable::containsKey)
    .findFirst()
    .ifPresent(name -> stringToRunnable.get(name).run());
Run Code Online (Sandbox Code Playgroud)

这个想法是保持键和Runnables 的映射。通过具有Runnable值,可以定义不带参数的void方法引用。流首先过滤掉地图中不存在的所有值,然后找到第一个匹配项,并在找到后执行其方法。