2017-08-07 116 views
1

我正在嘗試學習Java 8.有沒有辦法將下面的方法轉換爲Java 8流,filterforEach。如果是這樣,怎麼樣?將增強的循環轉換爲Java 8流,篩選器 - forEach

protected void isValidId(CarModel model, List<String> errors) throws DataAccessException { 

    CarStyle[] styles = model.getStyles(); 

    for(CarStyle style : styles){ 
     if(!style.isModels()){ 
      if(style.getStyleId() > 99){ 
      errors.add(INVALID_ID + ", Id:" + style.getStyleId()); 

      } 
     } 
    } 
} 

我讀了一些關於java 8的教程,但不確定如何實現這個。謝謝。

編輯:我給該方法添加了一個列表。

+0

如果你所描述的循環應該做這將幫助 - 現在它不返回任何東西,或對數據進行處理任何事情,所以回答 – UnholySheep

+0

很難這是整個代碼? if裏面是什麼?不要告訴我什麼都沒有,並且在'if's中調用的方法有副作用!爲什麼名爲isXxx的方法返回void而不是布爾值,如預期的那樣? –

+3

你到目前爲止嘗試過什麼?閱讀流文檔時,將以下代碼轉換爲Java Stream API非常簡單。粘貼最終結果不會幫助您學習Java 8。 –

回答

4

你嵌套if聲明等於filter。稍後,您可以將您的過濾元件,以錯誤的字符串,並收集他們現有的集合:

Arrays.stream(model.getStyles()) 
    .filter(s -> !s.isModels() && s.getStyleId() > 99) 
    .map(s -> String.format("%s, Id:%d", INVALID_ID, s.getStyleId())) 
    .forEach(errors::add); 

或...更合理的選擇是將返回錯誤的列表,而不是void

return Arrays.stream(model.getStyles()) 
    .filter(s -> !s.isModels() && s.getStyleId() > 99) 
    .map(s -> String.format("%s, Id:%d", INVALID_ID, s.getStyleId())) 
    .collect(Collectors.toList()); 
+1

* [collectionFactory](https: //docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toCollection-java.util.function.Supplier-) - 供應商返回一個**新的空**收集相應的類型* – shmosel

+1

@shmosel謝謝,修正:) –

+0

錯誤::添加作品? – piddler

1

假設方法調用沒有副作用,您不需要考慮在for循環中編輯數組(這與您的問題中的方法無關),您可以將代碼重寫爲這樣的:

protected void isValidId(CarModel model) 
{ 
    CarStyle styles[] = model.getStyles(); 

    Arrays.stream(styles) 
      .filter(style -> !style.isModels() && style.getStyleId() > 99) 
      .forEach(style -> { 

    }); 
} 
+0

請參閱編輯。我添加了一個列表 – piddler

1

我不知道你的代碼的結果應該是什麼,所以我假設你想只篩選符合條件的其中CarStyle秒。

你可以寫這樣的事情:

CarStyle[] styles = model.getStyles(); 
    return Stream.of(styles) 
      .filter(style -> !style.isModels() && style.getStyleId() > 99) 
      .map(style -> INVALID_ID.concat(", Id:").concat(style.getStyleId())) 
      .collect(Collectors.toList()); 
+0

重複的過濾器將使代碼效率更低 – msrd0

+0

@ msrd0不夠關心它 –

+0

@GrzegorzPiwowarek取決於數組的大小,但可能你是對的 – msrd0

2
protected void isValidId(CarModel model) throws DataAccessException { 

    CarStyle[] styles = model.getStyles(); 
    Stream<CarStyle> stylesStream = Arrays.stream(styles); 

    stylesStream.filter(style -> !style.isModels()) 
     .filter(style.getStyleId() > 99) 
     .forEach(System.out::println)   
} 

上面的代碼片段會打印出滿足要求的所有樣式。


編輯

protected void isValidId(CarModel model, List<String> errors) throws DataAccessException { 

    CarStyle[] styles = model.getStyles(); 
    Stream<CarStyle> stylesStream = Arrays.stream(styles); 

    stylesStream.filter(style -> !style.isModels()) 
     .filter(style -> style.getStyleId() > 99) 
     .forEach(s-> errors.add(INVALID_ID + ", Id:" + s.getStyleId()) 
} 

該代碼段會做同樣的代碼。

我建議您在本教程: http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

+1

不能我們把它縮短到Arrays.stream(model.getStyles).filter(ect)? – piddler

+0

@piddler是的,我們可以。 – Chase