Lambda 表达式

Lambda表达式是Java 8中最大和最令人期待的特性。Lambda表达式促进函数式编程,并大大简化了开发过程。

语法

Lambda表达式使用 -> 语法

parameter -> expression body
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
  statment1;
  statment2;
  //.............
  return statmentM;
}

下面是lambda表达式的重要特征—

  • 参数类型可选。参数类型可以省略,绝大多数情况,编译器都可以从上下文环境中推断出lambda表达式的参数类型。
  • 括号()可选当。lambda表达式的参数个数只有一个,可以省略小括号,多个参数括号是必须的。
  • 大括号{}可选。当lambda表达式只包含一条语句时,可以省略大括号和语句结尾的分号。
  • 可以省略return。当lambda表达式只有一条语句时,编译器自动返回该语句的返回值。

 

public class Java8Tester {
   public static void main(String args[]){
      Java8Tester tester = new Java8Tester();
        
      //with type declaration
      MathOperation addition = (int a, int b) -> a + b;
        
      //with out type declaration
      MathOperation subtraction = (a, b) -> a - b;
        
      //with return statement along with curly braces
      MathOperation multiplication = (int a, int b) -> { return a * b; };
        
      //without return statement and without curly braces
      MathOperation division = (int a, int b) -> a / b;
        
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
        
      //without parenthesis
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
        
      //with parenthesis
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
        
      greetService1.sayMessage("Mahesh");
      greetService2.sayMessage("Suresh");
   }
    
   interface MathOperation {
      int operation(int a, int b);
   }
    
   interface GreetingService {
      void sayMessage(String message);
   }
    
   private int operate(int a, int b, MathOperation mathOperation){
      return mathOperation.operation(a, b);
   }
}

作用域

你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量()。 Lambda表达式可以引用类成员和局部变量(会将这些变量隐式得转换成final的),如下列中的separator默认是final。

String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach( 
    ( String e ) -> System.out.print( e + separator ) );

示例-排序字符串

在老版本中,只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

 使用lambda表达式:

Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

函数体只有一行代码,可以去掉大括号和return:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

不写参数类型,有Java编译器自动推导:

Collections.sort(names, (a, b) -> b.compareTo(a));

 

 



posted @ 2017-07-24 13:22  April.Chen  阅读(231)  评论(0编辑  收藏  举报