2016-07-20 34 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表达式以来,我只是想确保我是不失任何东西。 –