zoukankan      html  css  js  c++  java
  • Java8 Lambda表达式

      在Java8之前,如果要往接口传参,总是传匿名内部类,如一个线程启动:

    new Thread(new Runnable() {
    	@Override
    	public void run() {
    		System.out.println("run");
    	}
    }).start();
    

     

      在Java8中出现了一种新特性Lambda 表达式,也可称为闭包,允许把函数作为一个方法的参数(函数作为参数传递进方法中),即函数式编程;

      函数式编程,在数学中,函数就是有输入量()、输出量return的一套计算方案,也就是“拿什么东西做什么事情”;相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式做;

      

      Lambda语法格式:

    (parameters) -> expression
    或
    (parameters) ->{ statements; }

      

      以下是Lambda表达式的重要特征:

    • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值;
    • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号;
    • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号;
    • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值;

      使用例程如下:

    public class LambdaTest {
    	
    	public static void main(String args[]){
    		// 类型声明
    		MathOperation addition = (int a, int b) -> a + b;
    
    		// 不用类型声明
    		MathOperation subtraction = (a, b) -> a - b;
    
    		// 大括号中的返回语句
    		MathOperation multiplication = (int a, int b) -> { return a * b; };
    
    		// 没有大括号及返回语句
    		MathOperation division = (int a, int b) -> a / b;
    
    		System.out.println("10 + 5 = " + operate(10, 5, addition));
    		System.out.println("10 - 5 = " + operate(10, 5, subtraction));
    		System.out.println("10 x 5 = " + operate(10, 5, multiplication));
    		System.out.println("10 / 5 = " + operate(10, 5, division));
    
    		// 不用括号
    		GreetingService greetService1 = message ->
    		System.out.println("Hello " + message);
    
    		// 用括号
    		GreetingService greetService2 = (message) ->
    		System.out.println("Hello " + message);
    
    		greetService1.sayMessage("Java");
    		greetService2.sayMessage("C++");
        }
        
    	interface MathOperation {
    		int operation(int a, int b);
    	}
        
        interface GreetingService {
    		void sayMessage(String message);
        }
        
        private static int operate(int a, int b, MathOperation mathOperation) {
    		return mathOperation.operation(a, b);
        }
    
    }
    

      得到的结果为:

    10 + 5 = 15
    10 - 5 = 5
    10 x 5 = 50
    10 / 5 = 2
    Hello Java
    Hello C++
    

     

      以前用的是匿名内部类,现在可以用Lambda表达式来代替,做的事情是:参数传递;执行方法体做事情:()->{};

      在Lambda标准格式()->{}的基础上,使用省略写法的规则为:

    1. 小括号内参数的类型可以省略;

    2. 如果小括号内有且仅有一个参数,则小括号可以省略;

    3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号;

  • 相关阅读:
    hdu 4283 You Are the One ( dp 2012 ACM/ICPC Asia Regional Tianjin Online )
    hdu 4268 Alice and Bob (贪心 2012 ACM/ICPC Asia Regional Changchun Online)
    2sat 讲解
    高斯消元 Java 高精度版 HDU 2449 Gauss Elimination
    poj 3207 Ikki's Story IV Panda's Trick (2sat)
    poj 2723 Get Luffy Out (2 sat + 二分)
    hdu 2604 Queuing (矩阵乘法 求递推式)
    poj 1753 Flip Game (高斯消元 + 枚举 自由变量)
    poj 3683 Priest John's Busiest Day (2sat 模版)
    vs2008新特性
  • 原文地址:https://www.cnblogs.com/coder-zyc/p/10487133.html
Copyright © 2011-2022 走看看