Java 8 Lambda表达式

#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中能够为接口添加静态方法。

相关文章
相关标签/搜索