在java 8中使用流迭代列表

时间:2016-12-13 08:29:25

标签: 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;
 }
}

基本上,如果满足任何条件,则迭代3个条件的列表想要打破循环,并且在每个条件中都想调用不同的方法。

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

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();

    }
});