在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.Runnable和java.util.Comparator都是典型的函数式接口。当然函数式接口可以当作普通的接口,用实现子类加以实现,也可以用Lamdba创建实现对象,这更简化代码的实现。
Runnable就是一个函数式接口
@FunctionalInterface
public interface Runnable
{
public abstract void run();
}
例子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表达式时,只需要提供形式参数和方法体。由于函数式接口只有一个抽象方法,所以通过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 super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j
//Compator
int compare(T o1, T o2);
在Java SE 8之前的标准库中包含的函数式接口并不多。Java SE 8增加了java.util.function包,里面都是可以在开发中使用的函数式接口。开发人员也可以创建新的函数式接口。最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。