本文共 3834 字,大约阅读时间需要 12 分钟。
lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。
它是一个匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递)。可以写出更紧凑、更简洁、更灵活的代码。先提一个lambda表达式的重要特征:Lambda 需要 函数式接口的支持。
什么是 函数式接口呢?函数式接口(Functional Interface):定义的一个接口,接口里面必须 有且只有一个抽象方法 (JAVA8的接口可以有多个default方法),这样的接口就成为函数式接口。
那么,如果你在某处就真的只需要一个能做一件事情的函数而已,连它叫什么名字都无关紧要。
Lambda 表达式就可以用来做这件事。即 任何函数式接口都可以使用lambda表达式替换。 例如:Comparator、Runnable。Lambda 表达式的语法格式如下:
(parameters) -> expression 或 (parameters) ->{ statements; }
其中,“->”被称为 Lambda 操作符或剪头操作符。
它将 Lambda 分为两个部分:让我们来看下面这些例子:
// 返回两数之和 (int x, int y) -> { return x + y; } // 参数类型也可以省略 (x, y) -> { return x + y; } // 主体包含了一个语句,不需要 return (x, y) -> x + y; // 一个参数无需定义圆括号 c -> { return c.size(); } // 没有参数,也没有返回值 () -> { System.out.println("Hello World!"); }
lambda表达式有以下重要特征:
下面用 Comparator 的例子说明下化简的过程。
/** * 普通的Comparator */ Comparator comparator = new Comparator() { //使用新的排序规则 根据用户的姓名排序 @Override public int compare(User a,User b){ return a.getName().compareTo(b.getName()); } }; Collections.sort(list, comparator);
第一步: 去掉冗余的匿名类:将抽象方法的参数放 -> 左边, 将抽象方法要执行的功能放 -> 右边
Collections.sort(list,(User a, User b) -> a.getName().compareTo(b.getName()));
第二步:使用Comparator里的comparing方法
Collections.sort(list, Comparator.comparing((User p) -> p.getName()));
第三步:类型推导和静态导入
Collections.sort(list, comparing(p -> p.getName()));
第四步:方法引用
Collections.sort(list, comparing(Person::getName));
@Test public void testRunable(){ /** * 普通的Runnable */ Runnable runnable = new Runnable() { @Override public void run() { System.out.println("I am running"); } }; new Thread(runnable).start(); /** * 使用lambda后的 */ new Thread(() -> System.out.println("I am running")).start() ; }
@Test public void testComparator(){ /** * 普通的Comparator */ Comparator comparator = new Comparator() { //使用新的排序规则 根据用户的姓名排序 @Override public int compare(User a,User b){ return a.getName().compareTo(b.getName()); } }; /** * 使用lambda表达式实现 */ Comparator comparator1 = (a, b) -> a.getName().compareTo(b.getName()); Comparator comparator2 = Comparator.comparing(User::getName); Collections.sort(list, comparator); list.forEach(System.out::println); }
// 自定义函数式接口 @FunctionalInterface public interface MyInterface { void doSomething(String str); } @Test public void testMyInterface(){ /** * 普通的MyInterface */ MyInterface myInterface = new MyInterface() { @Override public void doSomething(String str) { System.out.println("hello " + str); } }; /** * 使用Lambda表达式 */ MyInterface myInterface1 = (c) ->System.out.println("hello " + c); }
@Test public void testForEach(){ /** * 原本的for-each循环写做法 */ for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } /** * 使用lambda表达式后的写法 */ list.forEach(System.out::println); }
转载地址:http://mgdlf.baihongyu.com/