2016-12-13 95 views
-1

什麼是用java 8 stream()重寫此迭代的最佳方式。在Java中使用流對列表進行迭代8

for (name : names){ 
    if(name == a){ 
    doSomething(); 
    break; 
    } 
    if(name == b){ 
    doSomethingElse(); 
    break; 
} 
if(name == c){ 
    doSomethingElseElse(); 
    break; 
} 
} 

基本上與以上3個條件列表進行迭代,如果其中任何的滿足想打破循環,並在每一個狀況要調用不同的方法。

+6

這段代碼不會做你認爲它的作用;使用'equals'來比較字符串而不是'=='。請參閱:[如何比較Java中的字符串?](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – Jesper

+1

您的「基本上」不會描述您因爲你也*爲這三種情況分別調用不同的方法。你爲什麼要*重寫這個來使用'stream()'?它看起來不像自然適合。 –

+0

我只是想知道是否有可能在單次迭代中使用stream()來完成。 – AriseEVE

回答

4

The answer by 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() { 
} 

,沒有工作是下面的代碼的一部分,但我把它添加到main()功能假設abc都是字符串。但是,這個想法可以適用於任何數據類型。

names.stream() 
    .filter(stringToRunnable::containsKey) 
    .findFirst() 
    .ifPresent(name -> stringToRunnable.get(name).run()); 

這個想法是保留鍵的地圖和Runnable s。通過將Runnable作爲值,可以定義不帶參數的void方法引用。流首先過濾掉地圖中不存在的所有值,然後找到第一個匹配項,並在找到時執行它的方法。

+0

很好的答案。 +1 – Eran

-2
Collection collection; 
collection.forEach(name->{ 
    if(name.equals(a))){ 
     doSomething(); 

    } 
    if(name.equals(b)){ 
     doSomethingElse(); 

    } 
    if(name.equals(c)){ 
     doSomethingElseElse(); 

    } 
}); 
+1

如果輸入任何if語句,我都希​​望循環剎車,因爲對於每個列表,只有單個If可能爲真。 – AriseEVE

+0

這是不正確的答案 – ZhekaKozlov

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

非常醜陋,但是在單次迭代中會做什麼。