2016-07-20 72 views
0

我是新來的Lambda表達式在Java中,我不知道是否有必要座Lambda表達式內還靠近掃描儀:是否需要關閉掃描儀內部的Lambda表達式?

public interface factorialInterface { 
    int factorialMe (int n); 
    } 


import java.util.Scanner; 
public class factorialDemo { 
    public static void main(String args[]) { 
     Scanner keyb = new Scanner (System.in); 

     factorialInterface fact = (n) -> { 
      int result = 1; 

      for (int i = 1; i <= n; i++) { 
       result = i * result; 
      } 
      keyb.close(); // <- not sure about this one. 
      return result; 
     }; 
     System.out.print("Pass value: "); 
     System.out.println(fact.factorialMe(keyb.nextInt())); 
     System.out.println(); 


     keyb.close(); 

    } 

} 

如果我不關閉的這裏面的「KEYB」阻止Eclipse會通知我有關資源泄漏的信息。總是建議關閉Lambda塊內的掃描儀? 感謝您的幫助!

+1

你確定要關閉'System.in'嗎? – bradimus

+1

我會說日食是錯誤的。您的lambda沒有理由與掃描儀有任何關係。 – njzk2

+0

您應該總是關閉一個'Scanner',*除''System.in'上的'Scanner'外。你不應該關閉'System.in'。 Eclipse沒有這種例外,所以你必須通過在'Scanner keyb = ...'之前的行上添加'@SuppressWarnings(「resource」)'來告訴它。 – Andreas

回答

0

您沒有在fact以內使用keyb,除了關閉它之外。它完全不屬於那裏。 n的階乘計算是一個純函數,僅取決於n而沒有別的。

這可能是Eclipse中的一個錯誤。嘗試將keyb的聲明更接近其用法,即在print("Pass value: ")之後。

+0

這就是我的想法!感謝你的回答。通常情況下,我從來沒有把閉幕聲明放在塊中,因爲(正如你所說)它與掃描儀無關,但自從我在一個小時前開始閱讀Lambda表達式以來,我只是想確保我是不失任何東西。 –