美文网首页
一起来学Java8(二)——Lambda表达式

一起来学Java8(二)——Lambda表达式

作者: 猿敲月下码 | 来源:发表于2019-10-24 13:38 被阅读0次

    Lambda简介

    什么是Lambda表达式,简单的说是一种匿名函数表达方式。因此Lambda表达式本质是个函数,只不过没有函数名称。

    Lambda表达式具有以下特点:

    • 匿名,它没有函数名称
    • 本质是个函数,除了函数名,它有参数列表、函数内容(方法体)、返回类型
    • 简洁,有时候可以省略参数的类型
    • 可传递,Lambda表达式可以当做一个变量进行存储

    Lambda的基本语法是:

    (参数列表) -> 表达式

    (参数列表) -> { 表达式; }

    哪里可以使用Lambda

    有函数式接口的地方就可以使用Lambda表达式。

    函数式接口的定义:一个接口里面只有一个抽象方法。

    拿Runnable接口来说,它是一个函数式接口,Runnable用法如下代码所示:

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("run...");
        }
    });
    thread.start();
    Thread.sleep(100);
    

    由于Runnable是个函数式接口,因此可以使用Lambda表示替换,替换后如下:

    // 方式2
    Thread thread2 = new Thread(() -> System.out.println("run2..."));
    thread2.start();
    Thread.sleep(100);
    

    这里的Lambda表达式内容即为:() -> System.out.println("run2..."),其中没有参数,没有返回值,只有一个方法体。这个表达式同样可以写成:

    Thread thread2 = new Thread(() -> { 
        System.out.println("run2..."); // 注意这里;结尾
    });
    

    注意:加了花括号,方法体内部语句必须要有;结尾

    还有一个函数式接口Callable,其内部的call方法需要返回一个值,Callable的使用方式如下代码所示:

    ExecutorService excutorService = Executors.newSingleThreadExecutor();
    Future<String> future = excutorService.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return "Jim";
        }
    });
    String name = future.get(); 
    System.out.println(name);
    

    使用Lambda表达式:

    ExecutorService excutorService = Executors.newSingleThreadExecutor();
    Future<String> future = excutorService.submit(() -> "Jim2");
    String name = future.get(); 
    System.out.println(name);
    

    这里() -> "Jim2"表示直接返回一个Jim2字符串,可以省略return关键字。当然也可以写成:

    excutorService.submit(() -> {
        return "Jim2";
    });
    

    下面我们自定义一个函数式接口,然后使用Lambda表达式来书写。

    package learn.java8.ch2;
    
    // 函数式接口
    @FunctionalInterface
    interface Caller {
        String call(String name);
    }
    
    class Serivce {
        private String name;
        
        public Serivce(String name) {
            this.name = name;
        }
        
        public String run(Caller caller) {
            return caller.call(name);
        }
    }
    
    public class LambdaTest2 {
    
        public static void main(String[] args) {
            Serivce service = new Serivce("Jim");
            String result = service.run((name) -> {
                return "My name is " + name;
            });
            System.out.println(result);
        }
    
    }
    

    此时Lambda表达式为:

    (name) -> {
        return "My name is " + name;
    }
    

    它具有参数列表、方法体、返回结果组成

    注意:name实际类型被省略了,可以加上:

    String result = service.run((String name) -> {
        return "My name is " + name;
    });
    

    如果有多个参数,则写成:

    (String a, String b) -> {}(a, b) -> {}

    Lambda表达式还可以当做变量进行存储,如下代码所示:

    package learn.java8.ch2;
    
    import java.util.function.Consumer;
    
    public class LambdaTest3 {
    
        static Consumer<String> consumer = (name) -> {
            System.out.println("My name is " + name);
        };
    
        static class Service {
            private String name;
    
            public Service(String name) {
                super();
                this.name = name;
            }
    
            public void run(Consumer<String> consumer) {
                consumer.accept(name);
            }
        }
    
        public static void main(String[] args) {
            // 可以直接调用
            consumer.accept("Jim");
            
            new Service("Tom").run(consumer);
        }
    
    }
    

    在这个例子中直接使用Lambda表达式定义了一个接口实现:

    static Consumer<String> consumer = (name) -> {
        System.out.println("My name is " + name);
    };
    

    可以理解为将Lambda表达式赋给了consumer变量当中,也可以理解为直接实现了Consumer接口中的方法。

    总之,只要有函数式接口的地方都可以使用Lambda表达式。

    小结

    本篇主要介绍了Lambda表达式的基本用法,以及在函数式接口中的使用方式。

    定期分享技术干货,一起学习,一起进步!

    相关文章

      网友评论

          本文标题:一起来学Java8(二)——Lambda表达式

          本文链接:https://www.haomeiwen.com/subject/gnwrvctx.html