Java8新特性——Lambda表达式

在2月4日,Java已经发布了java8 rc1版本了,由此来过过java8的瘾

Java下载地址https://jdk8.java.net/download.html

对应的支持java8的  eclipse-java下载地址http://downloads.efxclipse.org/eclipse-java8/efxclipse-jdk8/


在说Lamdba表达式之前,先说一下函数式接口,Java 8引入了@FunctionalInterface注解来表明一个接口为一个函数式接口,函数式接口就是只包含一个抽象方法的接口。当然,不管FunctionalInterface注解是否存在,只包含一个抽象方法的接口,java编译器都会把它看作函数式接口比如java.lang.Runnablejava.util.Comparator都是典型的函数式接口。当然函数式接口可以当作普通的接口,用实现子类加以实现,也可以用Lamdba创建实现对象,这更简化代码的实现。


Runnable就是一个函数式接口


@FunctionalInterface
public interface Runnable 
{
    public abstract void run();
}

Lambda表达式

例子1


/**
 * @author Joeson
 */
public class Test
{

	public static void main(String[] args)
	{
//		runPast();
		run();
	}

	/**
	 * 以前的写法
	 */
	public static void runPast()
	{
		new Thread(new Runnable()
		{

			@Override
			public void run()
			{
				System.out.println("以前的实现");

			}
		}).start();
	}

	/**
	 * Lambda表达式写法
	 */
	public static void run()
	{
		new Thread(() -> {
			System.out.println("Lambda表达式!");
		}).start();
	}
}

相对于传统的方式,lambda表达式在两个方面进行了简化:首先是Runnable接口的声明,这可以通过对上下文环境进行推断来得出;其次是对run方法的实现,因为函数式接口中只包含一个需要实现的方法。

在使用lambda表达式时,只需要提供形式参数和方法体。由于函数式接口只有一个抽象方法,所以通过lambda表达式声明的方法体就肯定是这个唯一的抽象方法的实现,而且形式参数的类型可以根据方法的类型声明进行自动推断。



函数式接口的重要属性

(1) 我们能够使用lambda实例化它们

Runnable r = () ->{ System.out.println("Running!"); }

(2) Lambda表达式让你能够将函数作为方法参数,或者将代码作为数据对待

列子

/**
 * 
 * @author Joeson
 *
 */
public class Test1
{
	public static void main(String[] args)
	{
		ArrayList list = new ArrayList<>();
		list.add(12);
		list.add(10);
		list.add(3);
		list.add(34);
		list.add(40);
		Collections.sort(list, (x, y) -> x - y);

		System.out.println(list);
	}
}

结果



那Collections.sort(list,(x,y) ->  x-y);这里又发生什么事呢

其实这里也是一个Lambda的使用,看一下Collection.sort()方法的实现

 @SuppressWarnings({"unchecked", "rawtypes"})
    public static  void sort(List list, Comparator c) {
        Object[] a = list.toArray();
        Arrays.sort(a, (Comparator)c);
        ListIterator i = list.listIterator();
        for (int j=0; j

而Compator(因为他也有@FunctionalInterface注解)是一个函数式子接口,所以Lambda表达式相当于对Compator中的抽象方法进行实现。

//Compator
int compare(T o1, T o2);


所以这就理所当然了


在Java SE 8之前的标准库中包含的函数式接口并不多。Java SE 8增加了java.util.function包,里面都是可以在开发中使用的函数式接口。开发人员也可以创建新的函数式接口。最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。



你可能感兴趣的:(Java)