美文网首页
java8新特性之lambda

java8新特性之lambda

作者: 梦想实现家_Z | 来源:发表于2019-03-16 20:08 被阅读0次

Java 8 Tutorial
1.先来一段lambda的常规应用

public class LambdaMain {

    /**
     * lambda典型应用
     */
    private static void print() {
        //1.8之前
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world");
            }
        }).start();

       //1.8
        new Thread(() -> System.out.println("hello world")).start();
    }

    /**
     * 主函数
     *
     * @param args
     */
    public static void main(String[] args) {
        print();
    }
}

我查看Runnable的源码发现,之所以可以使用lambda表达式,是因为Runnable的接口上有一个@FunctionalInterface的注解。所以,我们也可以自定义自己的lambda接口。

2.简单实践

public class LambdaMain {

    /**
     *   自定义接口
     */
    @FunctionalInterface
    private interface MathOperation {
        /**
         * 对a和b两数字的相关操作,并返回操作后的结果
         *
         * @param a
         * @param b
         * @return
         */
        int operate(int a, int b);
    }

    /**
     * 对a和b两数字按照operation进行操作
     *
     * @param a
     * @param b
     * @param operation
     * @return
     */
    private static int operate(int a, int b, MathOperation operation) {
        return operation.operate(a, b);
    }

    /**
     * lambda测试
     */
    private static void lambda() {

        //自定义一个add动作
        MathOperation add = (int a, int b) -> a + b;

        //对1,2两数字进行add操作
        int result1 = operate(1, 2, add);
        System.out.println(result1);

        //对2,3两数字进行乘法操作
        int result2 = operate(2, 3, (a, b) -> a * b);
        System.out.println(result2);
    }


    /**
     * 主函数
     *
     * @param args
     */
    public static void main(String[] args) {
        lambda();
    }
}

类似上面的lambda使用方法,免去了创建大量实现类和匿名类的麻烦,并且带给java函数式编程的能力。

3.方法引用

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

public class LambdaMain {

    /**
     *  实体类Car
     */
    private static class Car {
        /**
         * 将创建实例的具体实现下放给CarFactory,CarFactory可以有不同的实现
         *
         * @param supplier
         * @return
         */
        private static Car createInstance(Supplier<Car> supplier) {
            return supplier.get();
        }

        /**
         * 通过反射创建对象(静态函数)
         *
         * @return
         */
        public static Car newInstance() {
            try {
                return Car.class.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return null;
        }

        /**
         * 车启动
         */
        public void start() {
            System.out.println("车辆启动");
        }
    }

    /**
     * Car工厂类
     */
    private static class CarFactory {

        /**
         * 通过构造函数创建Car实例
         *
         * @return
         */
        public static Car createInstance1() {
            //Car.createInstance(()->new Car())的变形
            return Car.createInstance(Car::new);
        }

        /**
         * 通过调用newInstance静态方法创建对象
         *
         * @return
         */
        public static Car createInstance2() {
            //Car.createInstance(()->Car.newInstance())的变形
            return Car.createInstance(Car::newInstance);
        }

        /**
         * 修理车
         *
         * @param car
         */
        public static void repair(Car car) {
            System.out.println("repair a car");
        }
    }

    /**
     * 主函数
     *
     * @param args
     */
    public static void main(String[] args) {
        //用来装car
        List<Car> list = new ArrayList<>();
        //car1
        Car car1 = CarFactory.createInstance1();
        list.add(car1);
        //car2
        Car car2 = CarFactory.createInstance2();
        list.add(car2);
        //循环调用car实例方法
        list.forEach(Car::start);
        //循环调用CarFactory的静态方法
        list.forEach(CarFactory::repair);
        //循环调用println函数
        list.forEach(System.out::println);
    }
}

4.jdk8自带的函数接口
函数式接口(@FunctionalInterface注解)有且只有一个抽象方法,但是可以有多个默认实现方法。
jdk8之前已有的函数式接口:

java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener

jdk8新增的函数式接口
整个java.util.function包下面的接口

结束语:上述的一些例子只是简单地对lambda表达式做了示范,更多的使用方法可以在Java 8 Tutorial中查看,里面有更多更详细的例子供大家参考和学习。

相关文章

  • Java8特性之Lambda、方法引用和Streams

    Java8特性之Lambda、方法引用和Streams Java8已经推出了好一段时间了,而掌握Java8的新特性...

  • Java 8、9 语言新特性

    Java语言新特性 Java8 Java 8 新特性 Lambda 表达式 Lambda表达式(也叫做闭包)是Ja...

  • Java8 新增了非常多的特性

    新特性Java8 新增了非常多的特性,我们主要讨论以下几个: Lambda 表达式 − Lambda允许把函数作为...

  • java8

    现代化 Java - Java8 指南 JAVA8新特性(吐血整理) 理解 Lambda 表达式

  • java8 新特性

    java8 新特性 1 Lambda表达式 lambda 是一个匿名函数, lambda 表达式基本语法: jav...

  • Java8常用的新特性总结

    一、Java8常用的新特性总结 1.1.Java8常用特性总览 1.2.lambda表达式 在Java8中引入了一...

  • Lambda的基础使用

    Lambda是java8出的新特性,之前很少用Lambda表达式写代码,现在慢慢习惯用Lambda表达式,并且记得...

  • java8新特性

    java8新特性 原创者:文思 一、特性简介 速度更快 代码更少,增加了Lambda 强大的Stream API ...

  • Lambda表达式

    内容整理自bilibili 参考链接 一、lambda表达式的简介 lambda表达式是java8添加的新特性; ...

  • Lambda 表达式

    Lambda 表达式 声明:java8新特性系列为个人学习笔记,参考地址点击这里,侵删!! Lambda 表达式,...

网友评论

      本文标题:java8新特性之lambda

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