• 技术文章 >Java >java教程

    Java实例详解之Lambda表达式

    长期闲置长期闲置2022-04-24 12:04:48转载583
    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于Lambda表达式的相关问题,Lambda表达式在Java语言中引入了一个操作符**“->”**,该操作符被称为Lambda操作符或箭头操作符,下面一起来看一下,希望对大家有帮助

    推荐学习:《java视频教程

    一、Lambda初识

    我们知道,在Java中,接口是不能实例化的,但是接口对象可以指向它的实现类对象。如果接口连实现对象都没有呢?那还可以使用匿名类的方式,如下:

    public class JavaTest {
        public static void main(String[] args) {
            Fly fly = new Fly() {
                @Override
                public void fly(String name) {
                    System.out.println(name + "飞行");
                }
            };
            fly.fly("张三");
        }}interface Fly{
        abstract void fly(String name);}

    但是,使用匿名内部的方式,代码量其实并不是非常简洁,而为了使代码更加的简洁,Java引进了Lambda表达式的写法,通过更简单的语法,去实现这样功能,使用Lambda表达式简化的代码如下:

    public class JavaTest {
        public static void main(String[] args) {
            Fly fly = name -> System.out.println(name + "飞行");
            fly.fly("张三");
        }}interface Fly{
        abstract void fly(String name);}

    通过Lambda表达式完成了同样的效果,但是代码量却精简了非常对,这就是Lambda表达式的魅力。

    二、 函数式接口

    在学习Lambda表达式的语法之前,首先要知道什么是函数式接口, 只有一个待实现方法 的接口,就叫做函数式接口。

    //接口中只有一个待实现的方法 fly,所以这是函数式接口interface Fly{
         void fly(String name);}//接口中有两个待实现的方法 这是不是函数式接口interface Run{
        void fastRun();
        void slowRun();}//接口中有两个方法,但其中一个是已经定义好的default方法,真正需要子类去实现的方法只有一个 这是函数式接口interface Jump{
        void jump();
        default void highJump(){
            System.out.println("跳的更高");
        }}

    可以在接口上加**@FunctionalInterface注解,去断言这个接口是函数式接口,如果这个接口不是函数式接口,编译就会提示错误。
    在这里插入图片描述
    为什么要知道什么是函数式接口呢?因为Lambda表达式去简化一个接口的匿名类实现方式,它只
    能对函数式接口起作用**。
    这很容易理解,如果一个接口有多个待实现的方法,Lambda表达式就不能分辨出它现在是对接口中哪个方法进行实现。

    三、Lambda表达式语法

    Lambda表达式在Java语言中引入了一个操作符**“->”**,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:

    左侧:指定了Lambda表达式需要的所有参数
    右侧:制定了Lambda体,即Lambda表达式要执行的功能。
    像这样:

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

    Lambda表达式的除了->和Lambda体,其他的比如参数,小括号,中括号都是可以更加参数类型、方法体代码行数进行省略的。
    以如下函数式接口的实现为例:

    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);
        }
        
        interface NoParam{
            int returnOne();
        }

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

            // 类型声明
            MathOperation addition = (int a, int b) -> a + b;
            // 不用类型声明
            MathOperation subtraction = (a, b) -> a - b;
          // 不用括号
            GreetingService greetService1 = message ->
                    System.out.println("Hello " + message);
    
            // 用括号
            GreetingService greetService2 = (message) ->
                    System.out.println("Hello " + message);
         // 多条语句不可以省略大括号
            MathOperation multiplication = (int a, int b) -> {
                int num = a+1;
                num = a + b;
                return a * b + num;
            };
    
            // 单条语句可以省略大括号
            MathOperation pision = (int a, int b) -> a / b;
      // 多条语句的Lambda表达式如果有返回值,需要使用return
            MathOperation multiplication = (int a, int b) -> {
                int num = a+1;
                num = a + b;
                return a * b + num;
            };
    
            // 单条语句可以省略return
            MathOperation pision = (int a, int b) -> a / b;

    四、Lambda表达式的使用范围

    Lambda表达式并不只是单单的用来简化一个匿名类的创建,它还有更多的用法。

    1、为变量赋值

    上文中,对Lambda表达式的用法都是为变量赋值的写法,这样可以简化匿名内部类赋值的代码段,提高阅读效率。

    MathOperation subtraction = (a, b) -> a - b;

    2、作为return结果

    interface MathOperation {
            int operation(int a, int b);
        }
    
        MathOperation getOperation(int a, int b){
            return (a1, b1) -> a+b;
        }

    3、作为数组元素

    MathOperation math[] = {
                    (a,b) -> a+b,
                    (a,b) -> a-b,
                    (a,b) -> a*b        };

    4、作为普通方法或者构造方法的参数

    public static void main(String args[]){
    
            Java8Tester java8Tester = new Java8Tester();
            java8Tester.operate(1,2,((a, b) -> a*b));
    
        }
    
        private int operate(int a, int b, MathOperation mathOperation){
            return mathOperation.operation(a, b);
        }
    
        interface MathOperation {
            int operation(int a, int b);
        }

    五、Lambda表达式的作用域范围

    Lambda表达式表达体内,可以访问表达体外的变量,但无法对其他变量进行修改操作。
    在这里插入图片描述

    六、Lambda表达式的引用写法

    在学习Lambda的时候,还可能会发现一种比较奇怪的写法,例如下面的代码:

    // 方法引用写法GreetingService greetingService = System.out::println;
            greetingService.sayMessage("hello world");

    这里出现了一个从来没见过的符号 :: ,这种写法就叫做方法的引用。
    显然使用方法引用比普通的Lambda表达式又简洁了一些。

    如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用。

    public class Java8Tester {
    
    
        public static void main(String args[]){
    
            // 静态方法引用--通过类名调用
            GreetingService greetingService = Test::MyNameStatic;
            greetingService.sayMessage("hello");
            Test t = new Test();
            //实例方法引用--通过实例调用
            GreetingService greetingService2 = t::myName;
            // 构造方法方法引用--无参数
            Supplier<Test> supplier = Test::new;
            System.out.println(supplier.get());
        }
    
    
    
        interface GreetingService {
            void sayMessage(String message);
        }}class Test {
        // 静态方法
        public static void MyNameStatic(String name) {
            System.out.println(name);
        }
    
        // 实例方法
        public void myName(String name) {
            System.out.println(name);
        }
    
        // 无参构造方法
        public Test() {
        }}

    7、Lambda表达式的优缺点

    优点:

    缺点

    推荐学习:《java视频教程

    以上就是Java实例详解之Lambda表达式的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:java
    上一篇:详细了解一下Java并发编程三要素 下一篇:Java归纳总结之数组详解
    千万级数据并发解决方案

    相关文章推荐

    • 图文详解!java中锁的整理总结• Java技巧总结之如何看Lambda源码• 深入了解JavaScript中的DOM与BOM• 实例详解JAVA抽象工厂模式• 一起聊聊Java多线程之线程安全问题
    1/1

    PHP中文网