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




  • 相关阅读:
    2018最新php笔试题及答案(持续更新)
    快速上手模板制作
    春节期间小游戏同时在线人数最高达2800万人/小时
    公众平台新增修改文章错别字功能 每篇文章允许被修改一次仅限正文内五个字
    微信6.6.2版更新:支持两个账号一键切换
    小程序支持打开APP了 还有小程序的标题栏也可以自定义
    小程序发布重磅数据:日活跃用户数1.7亿、已上线小程序58万个,覆盖100万开发者、2300个第三方平台
    张小龙2018PRO版微信公开课演讲全文 透露2018微信全新计划
    除了跳一跳还有16款微信小游戏可以玩
    小游戏里潜藏着600亿的大市场
  • 原文地址:https://www.cnblogs.com/daxiong225/p/8665460.html
Copyright © 2011-2022 走看看