java8-详解Lamda表达式

一回顾与说明

????通过之前发布的”Java8Lamda和Stream原理引入“一文章中你已经了解了为什么会有Lamda表达式的由来,Lamda表达式的基本语法等;Lamda表达式简而言之:Lamda表达式本质上就是匿名类,我们称Lamda表达式就是函数式接口的实现;

二Lamda表达式的结构与函数式接口的关系

1准备工作

例子还是之前文章关于车的例子

判断型函数式接口:

/**
 * @Author lsc
 * @Description <p> </p>
 * @Date 2019/9/27 14:05
 * @Version 1.0
 */
@FunctionalInterface
public interface CarPredicate  {

    boolean test(Car car);
}

车实体类:

/**
 * @Author lsc
 * @Description <p> </p>
 * @Date 2019/9/27 11:09
 * @Version 1.0
 */
@Data
@AllArgsConstructor
public class Car {

    // 车牌号
    private String code;
    // 颜色
    private String color;
    // 生产商
    private String factory;
    // 价格
    private double price;
}

初始化实例函数:

    public List<Car> InitCar(){
        ArrayList<Car> carList = new ArrayList<>();
        Car car1 = new Car("100", "black", "中国", 20);
        Car car2 = new Car("101", "gray", "中国", 30);
        Car car3 = new Car("102", "yello", "中国", 50);
        Car car4 = new Car("103", "silvery", "英国", 20);
        Car car5 = new Car("104", "red", "英国", 30);
        carList.add(car1);
        carList.add(car2);
        carList.add(car3);
        carList.add(car4);
        carList.add(car5);
        return carList;
    }

根据条件获得车函数:

    public List<Car> getCarByPredicate(List<Car> carList, CarPredicate carPredicate){
        ArrayList<Car> resultList = new ArrayList<>();
        for (Car car : carList){
            if (carPredicate.test(car)){
                resultList.add(car);
            }
        }
        return resultList;
    }

2 Lamda 的结构

我们之前用Lamda是这样调用:

    @Test
    public void getCarByPredicatByLamda(){
        // 初始化车信息
        List<Car> cars = carFunFactory.InitCar();
        // 获取颜色为红色的车
        List<Car> carByPrice1 = carFunFactory.getCarByPredicate(cars,car -> car.getPrice()>30);
        // [Car(code=102, color=yello, factory=中国, price=50.0)]
        System.out.println(carByPrice1);
    }

图解Lamda 结构

3 Lamda与函数式接口的关系与类型推断

再次强调:Lamda表达式是对函数式接口的实现


类型?推断:


类型推断void:?

    // void 兼容 Lamda一句表达式的函数签名
    @Test
    public void runnableTest(){
        Runnable runnable = () -> System.out.println("欢迎关注youku1327");
        runnable.run();
    }

图解void类型推断?:


没有类型推断:

三内置函数式接口

1 Predicate<T>

java.util.function.Predicate;函数签名:boolean test(T t);
我们可以实现的Lamda函数签名:T -> boolen;

示例:

    @Test
    public void predicateTest(){
        Predicate predicate = s -> s.equals("youku1327");
        boolean youku1327 = predicate.test("youku1327");
        System.out.println(youku1327);//true
    }

2 Consumer<T>

java.util.function.Consumer;函数签名: void accept(T t);
我们可接受的Lamda函数签名:T -> void;

    @Test
    public void consumerTest(){
        Consumer consumer = s -> System.out.println(s);
        consumer.accept("youku1327");//youku1327
    }

3Function<T, R>

java.util.function.Function;函数签名?:R apply(T t);
我们可接受的Lamda函数签名:T -> R;?

    @Test
    public void functionTest(){
        ArrayList<Object> list = new ArrayList<>();
        Function function = s -> list.add(s);
        function.apply("youku1327");
        System.out.println(list);//[youku1327]
    }

4 Supplier<T>

java.util.function.Supplier;函数签名: T get();
我们可以接受的Lamda函数签名: void -> T

    @Test
    public void supplierTest(){
        ArrayList<Object> list = new ArrayList<>();
        Supplier supplier = () ->  "youku1327";
        System.out.println(supplier.get());//youku1327
    }

四 致谢

感谢观看Lamda与函数式接口的入门原理篇,有梦想的程序员,学技术不仅学使用方法,还要学原理,你将技术当工具,技术何尝不是把你当工具,想要系统学习快关注我的公众号吧;

原文地址:https://www.cnblogs.com/zszxz/p/12066855.html

时间: 2024-08-29 21:18:03

java8-详解Lamda表达式的相关文章

JAVA8新特性——Lamda表达式

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名内部类调用方式: interface MyInterface{ void lMethod(); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod(); } publi

JAVA quartz cron 表达式详解 日期表达式

quartz cron 表达式详解 字段         允许值               允许的特殊字符   秒           0-59                 , - * /   分           0-59                 , - * /   小时         0-23                 , - * /   日期         1-31                 , - * ? / L W C   月份         1-12

Java8特性详解 lambda表达式 Stream

1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正在将自己变的更高(Sha)级(Gua),更人性化.--------可以这么说lambda表达式其实就是实现SAM接口的语法糖. lambda写的好可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类. 先列举两个常见的简化(简单的代码同样好理解) 创建线程 排序 lambda表达式配合Jav

[二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type used to indicate that an interface * type declaration is intended to be a <i>functional interface</i> as * defined by the Java Language Specificat

详解EL表达式

分类:技术文档 2013-04-26 11:40:56 阅读(817) 评论(0) 收藏 举报 EL表达式概述 EL表达式是为了便于获取数据而定义的一种语言,JSP 2.0之后才成为一种标准.下面的示例是一个简单的EL表达式: <%@ page contentType="text/html; charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算符)和分界符组成的.通常,算术表达式有3种表示: ①中缀(infix)表示:<操作数><操作符><操作数>,如A+B. ②前缀(prefix)表示: <操作符><操作数><操作数>,如+AB. ③后缀(postfix)表示: <操作

JAVA8之lambda表达式详解,及stream中的lambda使用

原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗? 二.概念 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算

Java8 Lambda表达式深入学习(2) -- InvokeDynamic指令详解

为了更好的支持动态类型语言,Java7通过JSR292给JVM增加了一条新的字节码指令:invokedynamic.之后,JVM上面的一些动态类型语言,比如Groovy(2.0+)和JRuby(1.7.0+)都开始支持invokedynamic.不过让人意外的是,为动态语言量身定制的invokedynamic指令,居然也被用到了Java8的Lambda表达式(JSR335)实现上.本文会对invokedynamic(以下简写做indy)指令做出详细解释. 测试代码 Java7以及更早版本的Jav

Java8 Lambda表达式详解手册及实例

先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下Java8的新特性.Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了. 现在进入正题Java8的Lambda,首先看一下发音 ([?l?md?])表达式.注意该词的发音,b是不发音的,da发[d?]音. 为什么要引入Lambda表达式 简单的来说,引入La