Java 8 Lambda表达式
2016-07-08 00:00
501 查看
#Lambda表达式
##1.Lambda表达式
Lambda表达式是一段可以传递的代码,因此他可以执行一次或者多次。
输出为:Harry;Potter;Jack;Tom;
this is NimingThread!
this is lambda
##2.函数式接口
对于只包含一个抽象方法的接口,可以通过lamba表达式来创建接口的对象,这种接口被称为函数式接口。
##3.方法引用
有些时候,想要传递给其他代码的操作已经有实现的方法了。如按钮点击打印对象,如下
::操作符讲方法名和对象或类的名字分隔开来。如下三种情况:
对象::实例方法
类::静态方法
类::实例方法
还可以捕获方法引用中的super对象
输出为:test!!
##4.构造器引用
构造器引用同方法引用类似,不同的是构造器引用中方法名是new。
例如Test::new 表达Test类的构造器引用。
##5.变量作用域
通常,我们希望能在lambda表达式的闭合方法或其他类中访问其他的变量
输出为:hello world; hello world; hello world; hello world; hello world;
在lambda表达式中并没有定义word,count,使用的是sendMessage的参数变量。原因为一个lambda包含三个部分
一段代码
参数
自由变量的值,“自由”指的是不是参数,并且没有被定义的变量。
所以,此例中lambda有两个自由变量,word和count。
notes:含有自由变量的代码块称为闭包。
##6.默认方法
Java通过默认方法允许接口包含带有具体实现的方法。
如果一个接口中定义了一个默认方法,而另外一个父类或接口又定义了一个同名的方法,解决方法遵循如下规则:
选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具体相同名称和参数的默认方法就会被忽略。
接口冲突。如果一个父接口提供了一个默认方法,而另一个接口特提供了一个具有相同名称和参数的默认方法,那么必须通过在具体类里覆盖方法来解决冲突。
输出为:Animal is running
##7.接口中的静态方法
在Java 8中可以为接口添加静态方法。
##1.Lambda表达式
Lambda表达式是一段可以传递的代码,因此他可以执行一次或者多次。
String array[]={"Harry", "Potter", "Jack", "Tom"}; List<String> list=Arrays.asList(array); //使用lambda遍历 list.forEach((String) -> System.out.print(String+";")); //使用匿名类 new Thread(new Runnable() { @Override public void run() { System.out.println("this is NimingThread!"); } }).start();; //将匿名类转换为lambda表达式 new Thread(()->System.out.println("this is lambda")).start();
输出为:Harry;Potter;Jack;Tom;
this is NimingThread!
this is lambda
##2.函数式接口
对于只包含一个抽象方法的接口,可以通过lamba表达式来创建接口的对象,这种接口被称为函数式接口。
//使用lambda对数组排序 //方式一 Arrays.sort(array, (String s1, String s2) -> (s1.compareTo(s2))); //方式二 Comparator<String> sort = (String s1, String s2) -> (s1.compareTo(s2)); Arrays.sort(array, sort);
##3.方法引用
有些时候,想要传递给其他代码的操作已经有实现的方法了。如按钮点击打印对象,如下
//方式一 button.setAction(event->System.out.println(event)); //方式二: button.setOnAction(System.out::println);
::操作符讲方法名和对象或类的名字分隔开来。如下三种情况:
对象::实例方法
类::静态方法
类::实例方法
还可以捕获方法引用中的super对象
static class Test{ public void test(){ System.out.println("test!!"); } } static class TestImpl extends Test{ @Override public void test() { new Thread(()->super.test()).start(); } }
输出为:test!!
##4.构造器引用
构造器引用同方法引用类似,不同的是构造器引用中方法名是new。
例如Test::new 表达Test类的构造器引用。
##5.变量作用域
通常,我们希望能在lambda表达式的闭合方法或其他类中访问其他的变量
static void sendMessage(String word,int count){ new Thread(()->{for(int i=0;i<count;i++){ System.out.print(word+"; "); }}).start(); } //main程序调用 sendMessage("hello world", 5);
输出为:hello world; hello world; hello world; hello world; hello world;
在lambda表达式中并没有定义word,count,使用的是sendMessage的参数变量。原因为一个lambda包含三个部分
一段代码
参数
自由变量的值,“自由”指的是不是参数,并且没有被定义的变量。
所以,此例中lambda有两个自由变量,word和count。
notes:含有自由变量的代码块称为闭包。
##6.默认方法
Java通过默认方法允许接口包含带有具体实现的方法。
public interface Animal { public void sleep(); default public void run(){ System.out.println("I am Running"); }; }
如果一个接口中定义了一个默认方法,而另外一个父类或接口又定义了一个同名的方法,解决方法遵循如下规则:
选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具体相同名称和参数的默认方法就会被忽略。
接口冲突。如果一个父接口提供了一个默认方法,而另一个接口特提供了一个具有相同名称和参数的默认方法,那么必须通过在具体类里覆盖方法来解决冲突。
public class Animal { public void run(){ System.out.println("Animal is running"); } } public interface Activity { public void sleep(); default public void run(){ System.out.println("Activity is Running"); }; } public class Tiger extends Animal implements Activity{ @Override public void sleep() { // TODO Auto-generated method stub System.out.println("Tiger is Sleeping"); } //发生冲突时,重写run方法。 // @Override // public void run(){ // System.out.println("Tiger is running"); // } }
输出为:Animal is running
##7.接口中的静态方法
在Java 8中可以为接口添加静态方法。
相关文章推荐
- 深度优先和广度优先遍历及其 Java 实现
- 关于使用Intellij Idea创建SpringMVC框架时,Jsp里的EL表达式不能被解析的问题
- Java基础——数据类型
- Java基础——变量
- Java基础——基本数据类型的包装类
- java版两图对比相似度
- spring-data-mongo :Error creating bean with name 'indexCreationHelper':
- Java深度历险(五)——Java泛型
- Eclipse中建立JAX-WS的web服务-客户端
- Java深度历险(二)——Java类的加载、链接和初始化
- Java深度历险(一)——Java字节代码的操纵
- Java生成缩略图之Thumbnailator
- 使用java读取大文本文件(2G)
- Eclipse控制台乱码
- Java深度历险(六)——Java注解
- Think in Java 读书笔记(1)
- Java深度历险(三)——Java线程:基本概念、可见性与同步
- Java REST框架一览
- Eclipse中建立JSR181的web服务
- Java深度历险(七)——Java反射与动态代理