2017-05-20 20 views
0
private static boolean isCompositeLambda(int number) { 
     return number > 3 && Stream.iterate(2, i -> i + 1) 
            .filter(x -> number % x == 0) 
            .limit((long) Math.sqrt(number)) 
            .count() > 0; 
    } 

當我給5它進入無限循環。 任何人都可以給出正確的代碼找到一個數字的Lambda表達式是否合成

+0

該限制值的數量,而不是值的極限,其中過濾器將阻止反正。 –

回答

2

您有兩個問題,第一個應用過濾器,第二個是限制值是數值,而不是它自己的值。

它進入一個非常長(但不是無限)的循環,因爲它需要很長時間才能生成數字的限制。例如對於5它試圖得到2個數字((長)Math.sqrt(5))== 2L,但是要實現第一個解決方案時number == x然而它必須檢查另一個〜40億個值溢出之前,並達到-number得到第二個解決方案和達到的限制。即5%5 == 0和5%-5 == 0

一種更簡單的解決方案是

private static boolean isCompositeLambda(int number) { 
    return number > 3 && 
      IntStream.rangeClosed(2, (int) Math.sqrt(number)) 
        .anyMatch(x -> number % x == 0); 
}