zoukankan      html  css  js  c++  java
  • 抛开其它看技术本身之lambda

    前言

    • 如果你在别的教材上学习lambda感觉云里雾里,我相信,我这篇文章一定能为你解开心中所有疑惑。
    • 作者信息:网梦 QQ : 2756978088

    lambda定义

    • lambda是应用在只有一个抽象方法的接口上一种表达式,其目的是为了简化匿名内部类。(关键词:只有一个抽象方法,针对接口)

    先来看匿名内部类

    • 为了弄明白lambda表达式,先要明白什么是匿名内部类
    • 先定义一个接口 Message ,接口内有两个抽象方法 print()fun()
    interface Message {
        void print() ;
        void fun() ;
    }
    
    • 按照最初的方式,我们要使用这个接口,就必须要有一个类实现了这个接口,如下:
    class MessageImpl implements Message {
        public void print() {
        System.out.println("Hello World !") ;
        }
        public void fun() {
        System.out.println("fun method") ;
        }
    }
    
    • 在主方法中使用时,代码如下:
    public class Hello {
        public static void main(String[] args) {
            Message msg = new MessageImpl() ;
            msg.print() ;
            msg.fun() ;
       }
    }
    
    • 好了,现在来看匿名内部类上面为了使用接口里的方法,而特意建了一个类 MessageImpl ,这个类也没有扩充新方法,所以感觉有些多余,这时候就可以用匿名内部类来解决这个多余类的问题,代码如下:
    public class Hello {
        public static void main(String[] args) {
            // 删除 多余的MessageImpl 类,直接使用匿名内部类
            Message msg = new Message() {
                public void print() {
                    System.out.println("Hello World !") ;
                }
                public void fun() {
                    System.out.println("fun method") ;
                }
            } ;
            msg.print() ;
            msg.fun() ;
       }
    }
    
    • 以上代码省略了实现接口的类,直接在实例化时加了一个代码块,代码块里面覆写了接口中所有的抽象方法(可以是一个,也可以是多个)

    回到lambda,简化匿名内部类

    • 内部类看起来实在是繁琐,为了使代码更elegance,lambda应运而生。lambda定义了,当接口中有且仅有一个抽象方法时,可以将匿名内部部的写法简化。
    • 先假设Message接口中只有一个print抽象方法
    interface Message {
        void print() ;
    }
    
    • 基于以上匿名内部类的讲解使用时是如下情况:
    public class Hello {
        public static void main(String[] args) {
            Message msg = new Message() {
                public void print() {
                    System.out.println("Hello World !") ;
                }
            } ;
            msg.print() ;
       }
    }
    
    • 将匿名内部类部分代码拿出来,重点观察
    Message msg = new Message() {
        public void print() {
            System.out.println("Hello World !") ;
        }
    } ;
    
    • 用lambda表达式书写格式一:
    Message msg = () -> {System.out.println("Hello World !")} ;
    
    • 用lambda表达式书写格式二:
    Message msg = () -> System.out.println("Hello World !") ;
    

    lambda 概念总结

    • 前提条件:lambda表达式 是针对只有一个抽像方法的接口。
    • 语法格式如下两种(一种有大括号{},一种没有大括号)
    (参数) -> 表达式
    (参数) -> {代码行;}
    
    • 参数:因为lambda针对的接口中只有一个抽象方法,所以这里的 (参数) 就对应这个抽象方法的参数。
    • (参数) -> 表达式 :如果覆写方法的代码只有一行代码的话,那就可以省略掉大括号{}而直接书写单行表达式即可。
    • (参数) -> 表达式 :如果覆写方法的代码只有一行代码 并且 有返回值时,不仅可以省略大括号,还可以省略return关键字。
    • (参数) -> {代码行;} :如果覆写方法的代码有行代码时,就不能省略大括号{}
    • (参数) -> {代码行;} :如果覆写方法的代码只有一行代码 并且 有返回值 并且 还想写return关键字的话,那就不能省略大括号{}
  • 相关阅读:
    UVa-129
    UVa-524
    有点迷茫
    北邮之行~
    UVa-253
    心累--期末考试成绩
    UVa-220 Othello
    UVa-201 Squares
    UVA-1589 Xiangqi
    UVa-213 Message Decoding
  • 原文地址:https://www.cnblogs.com/haixianet/p/8607195.html
Copyright © 2011-2022 走看看