2017-08-14 29 views
1

我一直在試圖解決這個一段時間,但我的Java 8技能需要一些工作。的Java 8過濾謂詞參數索引出界

我有這個問題,在一個IntStream。我正在使用一個過濾器來調用一個謂詞,它將在當前項目和列表中的下一個項目上運行一些邏輯。

return IntStream.range(0, someList.size() - 1) 
      .filter(n -> someMethod(someList.get(n), someList.get(n + 1))) 
      .mapToObj(i -> ((Integer) i).toString()) 
      .collect(Collectors.joining(", ")); 

問題是沒有檢查最後一項。

所以說我有10個項目在列表中第一次迭代將看項目0和1,然後1和2等,直到我們得到10和IndexOutOfBounds

沒有錯誤在這裏拋出雖然在Java中8人或許期望這是很奇怪嗎?

如何才能說「」如果我們得到索引超出範圍只是返回true「?

我希望這是有道理的。乾杯

+3

你不應該試圖要解決運行時異常就像一個IndexOutOfBounds。這是一個錯誤。只需修復該錯誤。嘗試訪問列表界限之外的索引是沒有意義的。所以不要這樣做。 –

+1

正如@JBNizet所說的,你不應該試圖解決'IndexOutOfBoundsException'而是解決錯誤。然而,僅僅爲了記錄,你可以用** try-catch **:'try {拋出異常的代碼} catch(IndexOutOfBoundsException e){如果發生的話執行的代碼}'執行。 – Zabuza

+0

我不是想解決這個錯誤。我會很高興,如果它實際上拋出錯誤 – SpaceCowboy

回答

3

你試圖從0迭代到size+1,所以尺寸爲3的列表,你試圖給:

list[0] - 有效
list[1] - 有效
list[2] - 有效
list[3] - OOB,因爲列表只是大小3

將其更改爲:

return IntStream.range(0, someList.size()) 
    .filter(n -> n < someList.size()-1 ? someMethod(someList.get(n), someList.get(n+1)) : someOtherMethod(someList.get(n)).collect(Collectors.toList)); 

這將解決兩件事。一,它會幫你在range()有OOB;第二,它會檢查n是在邊界調用的someMethod的nn+1。你需要讓你想怎麼處理它在列表中的最後一個元素,雖然

+0

這是與OP相同的代碼。 –

+0

您是否可以突出顯示這些更改並解釋他們爲什麼解決問題? – Zabuza

+0

@JBNizet,哎呀抱歉,修正 – Parker

0

令說someList.size()= 10,所以最後一個元素是與指數9.另一種方法,然後你做例如n + 1,這是someList.get(9 + 1),然後發生異常。它應該是someList.size() - 1

return IntStream.range(0, someList.size()-1) .filter(n -> someMethod(someList.get(n), someList.get(n + 1))) .collect(Collectors.toList());

,它應該工作。

編輯:您需要做一些檢查

` private void invoke() { 

    List<String> someList = Arrays.asList("Test", "Super"); 
    int size = someList.size(); 

    List<Integer> collect = IntStream.range(0, size) 
      .filter(n -> someMethod(someList.get(n), getNext(someList, n + 1))) 
      .mapToObj(i -> i) 
      .collect(Collectors.toList()); 

} 

public <T> T getNext(List<T> someList, int index) { 
    return someList.size() > index ? someList.get(index) : null; 
} 


public boolean someMethod(String a1, String a2) { 
    return a1.equals(a2); 
} 
+0

這應該工作,雖然我還沒有讀取最後一個值。正如我所說,它按以下順序讀取列表:索引(0) - 索引(1),索引(1) - 索引(2).....索引(10) - 索引(11 - 沒有索引11) – SpaceCowboy

+0

我改進了我的答案。現在你可以複製和粘貼。 –

0

第二範圍內()函數是唯一的,這意味着,如果你將其設置爲20的範圍將去,直到19(不含20)參數在你的情況下,你想在最後得到索引,所以如果最後一個索引是size-1,你應該傳遞給函數size(),如果你想得到size-2,你應該傳遞最後一個參數size-1,這裏是一個簡單的例子

public static void main(String[] args) { 
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); 
    IntStream.range(0, list.size() - 1).forEach(index -> System.out.println("Me " + list.get(index) + " and my brother " + list.get(index + 1))); 
}