一. 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 Listlist=new ArrayList ();12 list.add("d");13 list.add("a");14 list.add("c");15 list.add("b");16 17 //法一18 // Collections.sort(list, new Comparator () {19 //20 // @Override21 // public int compare(String o1, String o2) {22 // // TODO Auto-generated method stub23 // 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 a2 b3 c4 d
note: 上面的String o1也可以不加String, jvm会自己解析;一句话也可以用大括号代替,但是必须是完整的语句
举例:自定义函数式接口,并用Lambda表达式
1 package com.test.a;2 3 @FunctionalInterface4 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