Java Lambda变量捕获 lambda表达式可以访问最终局部变量或局部非最终初始化只有一次的变量。 例子 下面的代码显示我们可以访问和使用最终的局部变量。 import java.util.function.Function; public class Main { public static void main(String[] argv) { final String x = "Hello"; Function<String,String> func1 = y -> {return y + " "+ x ;}; System.out.println(func1.apply("w3cschool.cn")); } } 上面的代码生成以下结果。 例2 下面的代码有一个变量x,它不是final,只能初始化一次。我们仍然可以在lambda表达式中使用它。 import java.util.function.Function; public class Main { public static void main(String[] argv) { String x = "Hello"; Function<String,String> func1 = y -> {return y + " "+ x ;}; System.out.println(func1.apply("w3cschool.cn")); } } 上面的代码生成以下结果。 例3 下面的代码显示我们不能改变在lambda表达式之外定义的值。 import java.util.function.Function; public class Main { public static void main(String[] argv) { String x = "Hello"; Function<String,String> func1 = y -> {/*x="a";*/ return y + " "+ x ;}; System.out.println(func1.apply("w3cschool.cn")); } } 上面的代码生成以下结果。 例4 我们可以更改lambda表达式中的非局部变量。 import java.util.function.Function; public class Main { static String x = "Hello";...
Java Lambda表达式作用域 lambda表达式不定义自己的范围。 如果我们在lambda中使用关键字 this 和 super 表达式在方法中,它们的行为与我们在该方法中使用它们一样。 例子 以下代码从lambda表达式输出this。这在lambda表达式中是指外部类不是lambda表达式本身。 import java.util.function.Function; public class Main { public Main(){ Function<String,String> func1 = x -> {System.out.println(this);return x ;}; System.out.println(func1.apply("")); } public String toString(){ return "Main"; } public static void main(String[] argv) { new Main(); } } 上面的代码生成以下结果。 例2 Main方法中的第一行具有 x 的变量定义。 如果我们删除注释,我们会得到编译时错误,因为它与lambda表达式的变量定义冲突。 这是另一个演示,显示lambda表达式与其外部方法具有相同的范围。 lambda表达式不会创建自己的作用域。 import java.util.function.Function; public class Main { public Main(){ //int x= 0; Function<String,String> func1 = x -> {System.out.println(this);return x ;}; System.out.println(func1.apply("")); } public String toString(){ return "Main"; } public static void main(String[] argv) { new Main(); } } 上面的代码生成以下结果。
Java脚本教程 – Java脚本引擎 Java Scripting API有许多类和接口。它们在javax.script包中。 ScriptEngine 接口是其实例执行以脚本语言编写的脚本的接口 ScriptEngineFactory执行两个任务: 创建脚本引擎的实例。 提供有关脚本引擎的信息,如引擎名称,版本,语言等。 AbstractScriptEngine类是一个抽象类,并为ScriptEngine接口提供了部分实现。 ScriptEngineManager类发现和实例化脚本引擎。 可用的引擎 以下代码显示如何列出所有可用的脚本引擎。 import java.util.List; import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; public class Main { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); // Get the list of all available engines List<ScriptEngineFactory> list = manager.getEngineFactories(); // Print the details of each engine for (ScriptEngineFactory f : list) { System.out.println("Engine Name:" + f.getEngineName()); System.out.println("Engine Version:" + f.getEngineVersion()); System.out.println("Language Name:" + f.getLanguageName()); System.out.println("Language Version:" + f.getLanguageVersion()); System.out.println("Engine Short Names:" + f.getNames()); System.out.println("Mime Types:" + f.getMimeTypes()); System.out.println("==="); } } } 上面的代码生成以下结果。 例子 以下代码显示了如何使用JavaScript,Groovy,Jython和JRuby在标准输出上打印消息。 如果脚本引擎不可用,程序会向用户提示错误消息。 import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Main { public static void main(String[] args) { // Get the script engine manager ScriptEngineManager manager = new...
Java脚本教程 – Java脚本标识符 标识符是脚本中变量,函数和标签的名称。 Nashorn中的标识符是一个Unicode字符序列,具有以下规则: 可以包含字母,数字,下划线和美元符号 不能以数字开头 不能是保留字之一 例子 以下是有效标识符的示例: Id _id e$Id num1 以下是无效标识符: 4num //Cannot start with a digit emp id //Cannot contain spaces emp+id //Cannot contains the + sign break //break is a reserved word and cannot be used as an identifier 关键词 Nashorn中保留字的列表用作关键字 break do instanceof typeof case else new var catch finally return void continue for switch while debugger function this with default if throw delete in try Nashorn未来保留词的列表 class enum extends super const export import Nashorn未来保留字的列表在严格模式 implements let private public yield interface package protected static 注释 Nashorn支持两种类型的注释: 单行注释 多行注释 在Nashorn中编写注释的语法与Java的语法相同。 以下是注释的示例: // A single-line comment var Id; /* A multi-line comment */ var et; var d;
Java脚本教程 – Java脚本变量 脚本语言是松散类型的。 变量的类型在编译时是未知的。类型可以在程序执行期间更改。并且基于存储在变量中的值在运行时确定。 在Nashorn中,关键字 var 用于声明一个变量。 // Declare a variable named a var a; 与Java不同,我们不在Nashorn中指定数据类型。 我们可以在一个变量语句中声明多个变量。 变量名称用逗号分隔: // Declare three variables var a, b, c; 变量在声明时初始化为 undefined 。 我们可以在声明时用一个值初始化一个变量: var a = 400, b = ["x", "y", "z"]; 在非限制模式中,可以在变量声明中省略关键字var: // Declare a variable named a without using the keyword var a = "xyz";
Java脚本 教程- Java脚本数据类型 Nashorn中的数据类型有两种类型:基本类型和对象类型。 基本类型包括以下五种数据类型: Undefined Null Number Boolean String 未定义类型 未定义类型只有一个值: undefined 。 在Nashorn中声明但未赋值的变量的值为 undefined 。 我们还可以将未定义的值明确分配给变量。我们可以比较另一个值和未定义。 以下代码显示了如何使用 undefined 的值: 在下面的行中,a被隐式初始化为undefined。 var a; b为initilaized明确定义。 var b = undefined; 打印出a和b的值。 print("a is", a) print("b is", b); 比较a和b的值。 if (a == undefined) { print("a is undefined") } if (b == undefined) { print("b is undefined") } 空类型 Null类型只有一个值为null。 null值用于空对象。 以下代码显示如何使用值 null : var person = null; print("person is", person); 数字类型 Nashorn不区分整数和浮点数。 它使用 Number 表示两种类型的数值。 我们可以用十进制,十六进制,八进制和科学记数法表示数字字面量。 Nashorn定义了数字类型的三个特殊值: 非数字 正无穷大 负无穷大 在脚本中,这些特殊值由 NaN 表示, + Infinity 和 -Infinity 。 正无穷大值也可以表示为简单的无穷。 以下代码显示如何使用数字文字和特殊数字类型值: var intNumber = 100; // An integer of type Number var salary = 1234.678; // A floating-point number of type Number var hexNumber = 0x0061; // Same as 97 is decimal var...