zoukankan      html  css  js  c++  java
  • java8 lambda表达式和函数式编程

    什么是函数式接口(Functional Interface)

    其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法 (可以有default, static方法)

    这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。

    Your first Lambda expression

      开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。我们在这里做了什么呢?那就是用() -> {}代码块替代了整个匿名类。

    // Java 8之前:
    new Thread(new Runnable() {
        @Override
        public void run() {
        System.out.println("Before Java8, too much code for too little to do");
        }
    }).start();
    
    //Java 8方式:
    new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();

    输出:

    too much code, for too little to do
    Lambda expression rocks !!

    这个例子向我们展示了Java 8 lambda表达式的语法。你可以使用lambda写出如下代码:

    (params) -> expression
    (params) -> statement
    (params) -> { statements }

    例如,如果你的方法不对参数进行修改、重写,只是在控制台打印点东西的话,那么可以这样写:

    () -> System.out.println("Hello Lambda Expressions");

    如果你的方法接收两个参数,那么可以写成如下这样:

    (int even, int odd) -> even + odd

    顺便提一句,通常都会把lambda表达式内部变量的名字起得短一些。这样能使代码更简短,放在同一行。所以,在上述代码中,变量名选用a、b或者x、y会比even、odd要好。

    因此总结一下的格式是

    params=参数,your Code=你的代码,results=返回值

    (params,params) -> {your Code}

    如果只有一个参数或者一行代码的话 可以将括号省略掉,于是就变成了

    params -> your Code

    如果是有返回值是的话是

    (params) -> {return results}

    同样,这种return只有一行的话,也可以简写,例如

    x -> x+1

    这就等效于

    (x) -> {return x+1}


    example:

    public class LambdaTest
    {
    public static void main(String args[]){
    LambdaTest tester = new LambdaTest();

    //with type declaration
    MathOperation addition = (int a, int b) -> { return a + b; };

    MathOperation addition1 = new MathOperation(){

    @Override
    public int operation(int a, int b)
    {
    // TODO Auto-generated method stub
    return 0;
    }};

    //with out type declaration
    MathOperation subtraction = (a, b) -> {return 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));

    //with parenthesis
    GreetingService greetService1 = message -> System.out.println("Hello " + message);

    //without 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);
    }
    }

    输出:

    10 + 5 = 15
    10 - 5 = 5
    10 x 5 = 50
    10 / 5 = 2
    Hello Mahesh
    Hello Suresh




  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/daxiong225/p/8665460.html
Copyright © 2011-2022 走看看