• 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




  • 相关阅读:
    mysql基础知识详解
    MySQL连接无法解析HOST主机名
    jQuery 判断页面元素是否存在
    jquery判断元素的子元素是否存在
    jQuery操作CheckBox的方法(选中,取消,取值)
    签署您的应用--手动签署 APK
    深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)
    深入理解net core中的依赖注入、Singleton、Scoped、Transient(三)
    深入理解net core中的依赖注入、Singleton、Scoped、Transient(二)
    深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)
  • 原文地址:https://www.cnblogs.com/daxiong225/p/8665460.html
Copyright © 2020-2023  润新知