#Lambda表达式数组
##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表达式来建立接口的对象,这种接口被称为函数式接口。ide
//使用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);
::操做符讲方法名和对象或类的名字分隔开来。以下三种状况:this
对象::实例方法code
类::静态方法对象
类::实例方法排序
还能够捕获方法引用中的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中能够为接口添加静态方法。