java lambda表达式
2018-03-11 11:09
561 查看
定义:传递一段可稍后执行的代码。如果你想立即执行该段代码就不应该使用lambda表达式。匿名函数。
延缓执行的原因:
- 运行代码在分离的线程中。
- 运行相同的代码多次。
- 在算法中对的时机执行(如排序的比较操作符)。
- 在某些事件发生后执行(例如点击了button)。
- 只有在必要的时候执行。
lambda表达式的使用:
在java中,lambda表达式只能用于function interfaces(功能接口)。
功能接口:一个有单一抽象方法的接口。
为什么功能接口必须有一个单一抽象接口?不是所有方法在接口中都是抽象的吗:事实上,对象类常常重新声明像toString(),clone()这些方法使他们不再是抽象的。而且在java SE8 中引入了default方法,接口可以被声明为非抽象的方法。
最好把lambda表达式想象成是一个函数而非对象。
比内部类高效。
Arraylist中有个removeIf()方法接收一个Predict参数,它是特定的设计传递一个lambda表达式,举个例子
lambda表达式语法
方法引用:
符号
使用原则:
this关键字:
super关键字:
构造引用:和方法引用类似,区别是方法名是new。
根据上下问调用对应的构造方法。
数组类型的构造引用了一个参数(数组长度)举个例子:
变量范围(可用域):
通常,你在封闭的方法和类中存取变量是要考虑变量的范围。例如:
这里text变量没有定义在lambda表达式中。
一个lambda表达式有三个要素:
一块代码。
参数。
提供给
上面的text就是free变量。
在lambda中的变量只能是effectively final的(初始化后从不赋予新值的).无论是在lambda表达式的内部还是外部。
lambda内部变量在命名时范围和嵌套块的一样,不能同名。
使用this关键字,引用的是创建该lambda方法的class的this。
延缓执行的原因:
- 运行代码在分离的线程中。
- 运行相同的代码多次。
- 在算法中对的时机执行(如排序的比较操作符)。
- 在某些事件发生后执行(例如点击了button)。
- 只有在必要的时候执行。
lambda表达式的使用:
在java中,lambda表达式只能用于function interfaces(功能接口)。
功能接口:一个有单一抽象方法的接口。
为什么功能接口必须有一个单一抽象接口?不是所有方法在接口中都是抽象的吗:事实上,对象类常常重新声明像toString(),clone()这些方法使他们不再是抽象的。而且在java SE8 中引入了default方法,接口可以被声明为非抽象的方法。
最好把lambda表达式想象成是一个函数而非对象。
比内部类高效。
Arraylist中有个removeIf()方法接收一个Predict参数,它是特定的设计传递一个lambda表达式,举个例子
list.removIf(e->e == null)移除array list中所有的空值。
lambda表达式语法
//1.单行 public class LambdaTest { public static void main(String[] args) { String [] strings = new String[]{"ad","bssf","csdaa","dd"}; //根据长度进行排序: Arrays.sort(strings,(String first,String second) -> first.length() - second.length()); System.out.println(Arrays.toString(strings)); } } //2.多行 Arrays.sort(strings, (String first, String second) -> { if (first.length() - second.length() > 0) return 1; else { return -1; } }); //3.无参 public class LambdaTest2 { public static void main(Stri 4000 ng[] args) { Runnable runnable = () -> System.out.println("Hello"); runnable.run(); } } //4.参数如果可以被推断也可以省略圆括号 // public Timer(int delay, ActionListener listener) Timer t = new Timer(1000,event -> { System.out.println("The time is" + new Date()); }); t.start(); JOptionPane.showMessageDialog(null, "quit?"); System.exit(0); //5.可以不指明返回类型,这常被以上下文推断出 //特别的:(int x) -> { if(x>=0) return 1;}是无效的。 (String first,String second) -> first.length() - second.length() //返回的肯定是int类型
方法引用:
符号
::分离对象名或类名中的方法。
使用原则:
object::instanceMethod Class::staticMethod 前面两个是参数给方法使用即x -> System.out.println(x);这样子的 Class::instanceMethod 这个一般有两个参数,前一个参数是方法的目标。例如(x,y)->x.CompareToIgnoreCase(y);
this关键字:
this::equals 等价于 x ->this.equals(x);
super关键字:
super::instanceMethod调用父类的实例方法。
构造引用:和方法引用类似,区别是方法名是new。
根据上下问调用对应的构造方法。
数组类型的构造引用了一个参数(数组长度)举个例子:
int[]::new 等价于 x ->new int[x]
变量范围(可用域):
通常,你在封闭的方法和类中存取变量是要考虑变量的范围。例如:
public static void repeatMessage(String text, int delay){ ActionListener listener = event -> { System.out.println(text); ToolKit.getDefaultToolkit().beep(); }; new Timer(delay,listener).start(); }
这里text变量没有定义在lambda表达式中。
一个lambda表达式有三个要素:
一块代码。
参数。
提供给
free变量的值。free变量指的是没有在lambda表达式中定义的无参变量。
上面的text就是free变量。
在lambda中的变量只能是effectively final的(初始化后从不赋予新值的).无论是在lambda表达式的内部还是外部。
lambda内部变量在命名时范围和嵌套块的一样,不能同名。
使用this关键字,引用的是创建该lambda方法的class的this。
相关文章推荐
- 学习Java8--Lambda表达式
- 浅谈Java 7的闭包与Lambda表达式之优劣
- 浅谈Java 7的闭包与Lambda表达式之优劣
- 深入浅出 Java 8 Lambda 表达式
- Java:Lambda 表达式
- java lambda表达式学习笔记
- Java8中Lambda表达式的10个例子
- JAVA Lambda表达式
- Java Lambda表达式(二)
- Java中Lambda表达式的使用
- Java进阶(五十五)-Java Lambda表达式入门
- Java 高级特性: Lambda 表达式
- Java Lambda表达式入门
- 探索Java语言与JVM中的Lambda表达式
- Java 8 Lambda 表达式学习心得总结
- Java Lambda表达式入门
- java8 lambda 表达式
- Java 8 新语法习惯 (完美的 lambda 表达式只有一行)
- Java8新特性——接口变化、Lambda表达式
- Java-函数式编程(二)Lambda表达式