一. Lambda表达式概述
Lambda表达式是Java8中最大的变化。它允许我们将一个函数当作方法的参数,或者说把一段代码当作数据使用。很多基于JVM平台的语言一开始就支持Lambda表达式,比如Scala,但是Java语言一直只能使用匿名内部类来替代Lambda表达式,直到Java8才使用Lambda表达式。
二.定义
Lambda表达式是一个匿名函数,它是一个函数式接口的具体实现方式;使用Lambda语法可以用来代替Java8之前的匿名内部类,从而简化代码。
任意只包含一个抽象方法的接口(函数式接口),我们都可以用来做成Lambda表达式;
三. Lambda表达式语法结构
包含三个部分
(1)参数:一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;
(2)箭头:->
(3)方法体:一个方法体,可以是表达式和代码块,方法体是函数式接口里面方法的实现,如果Lambda的功能语句块太复杂,我们可以使用大括号包起来,跟普通的Java方法一样;
总体结构如下:(parameters)->expression或者(parameters)->{statements;}
四. 具体使用
1 package com.test.a; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 import java.util.List; 7 8 public class Test { 9 10 public static void main(String args[]) { 11 List<String> list=new ArrayList<String>(); 12 list.add("d"); 13 list.add("a"); 14 list.add("c"); 15 list.add("b"); 16 17 //法一 18 // Collections.sort(list, new Comparator<String>() { 19 // 20 // @Override 21 // public int compare(String o1, String o2) { 22 // // TODO Auto-generated method stub 23 // return o1.compareTo(o2); 24 // } 25 // 26 // }); 27 28 //法二 29 // Collections.sort(list, (String o1,String o2)->o1.compareTo(o2)); 30 //法三 31 Collections.sort(list, (String o1,String o2)->{return o1.compareTo(o2);}); 32 for(String a:list) 33 { 34 System.out.println(a); 35 } 36 } 37 }
1 a 2 b 3 c 4 d
note: 上面的String o1也可以不加String, jvm会自己解析;一句话也可以用大括号代替,但是必须是完整的语句
举例:自定义函数式接口,并用Lambda表达式
1 package com.test.a; 2 3 @FunctionalInterface 4 public interface MyFunction { 5 6 public abstract String f(); 7 8 }
1 package com.test.a; 2 3 public class Test { 4 public static void main(String args[]) { 5 6 MyFunction myFunction = () -> ("hello"); 7 String aString = myFunction.f(); 8 System.out.println(aString); 9 } 10 } 11 12 13 hello