Lambda表达式Lambda表达式理解

  • Lambda表达式是Jdk 8 开始新增的一种语法形式;作用:用于简化匿名内部类的代码写法

注意:Lambda表达式只能简化函数式接口的匿名内部类!!!

什么是函数式接口?

  • 有且仅有一个抽象方法的接口。

  • 注意:大部分函数式接口,上面可能会有一个@FunctionalInterface的注解,有该注解的接口就必定是函数式接口。

Lambda表达式的省略写法(进一步简化Lambda表达式的写法)

  • 参数类型可以省略不写。

  • l如果只有一个参数,参数类型可以省略,同时()也可以省略。

  • l如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号!此时,如果这行代码是return语句,也必须去掉return关键字不写。

上代码

基于无参无返回值,无参有返回值,有参无返回值,有参有返回值

package com.itheima.yaoyao;​import java.util.Random;​public class LambdaDemo2 {    public static void main(String[] args) {        //基于匿名内部类调用useInterOne:分析有一个InterOne接口【快速创建接口的实现类对象】 怎么做!        useInterOne(new InterOne() {            @Override            public void methodOne() {                System.out.println("无参无返匿名内部类调用");            }        });​​        //基于Lambda表达式调用useInterOne:分析(1)必须要传递InterOne接口实现类对象【省略】(2)必须要实现methodOne抽象方法【省略】        //methodOne方法的逻辑【不能!】传递methodOne方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodOne方法的逻辑载体】       useInterOne(()->{System.out.println("lambda表达式表示无参无返");});​​        //基于匿名内部类调用useInterTwo        useInterTwo(new InterTwo() {            @Override            public Integer methodTwo() {                return 100;            }        });​​        //基于Lambda表达式调用useInterTwo:分析(1)必须要传递InterTwo接口实现类对象【省略】(2)必须要实现methodTwo抽象方法【省略】        //methodTwo方法的逻辑【不能!】传递methodTwo方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodTwo方法的逻辑载体】        //如果Lambda实现的方法需要返回值就要在{}中return回满足要求的结果​        useInterTwo(()->{            return new Random().nextInt(100);        });​        //基于匿名内部类调用useInterThree        useInterThree(new InterThree() {            @Override            public void methodThree(String name, String food) {                System.out.println(name+"爱喝"+food);            }        });​​        //基于Lambda表达式调用useInterThree:分析(1)必须要传递InterThree接口实现类对象【省略】(2)必须要实现methodThree抽象方法【省略】        //methodThree方法的逻辑【不能!】传递methodThree方法的逻辑(剩余的事情由Java来做) 【基于Lambda表达式来做methodThree方法的逻辑载体】        //如果Lambda表达式作为方法的载体,方法声明了形式参数,在Lambda的()中也要声明同样形式参数        useInterThree( (String name,String food) ->{            System.out.println(name + "爱吃"+"小鸡炖蘑菇");        });​​        //基于匿名内部类调用useInterFour        useInterFour(new InterFour() {            @Override            public String methodFour(String foodOne, String foodTwo) {                return foodOne+"炖"+foodTwo;            }        });​​        //基于Lambda调用         useInterFour((String foodOne, String foodTwo) ->{return foodOne + "炒"+ foodTwo ;});​    }​    //编写4个方法分别将四个接口作为方法的参数【传递四个接口中不同类型的方法Lambda表达式】    //在编写方法的时候并不明确方法的具体逻辑是什么 【多态:传递进来的实现类的实现逻辑是什么,这里就执行什么逻辑】    public static void useInterOne(InterOne interOne) {        interOne.methodOne();    }​    public static void useInterTwo(InterTwo interTwo) {        Integer result = interTwo.methodTwo();        System.out.println("useInterTwo Result:" + result);    }​    public static void useInterThree(InterThree interThree) {        interThree.methodThree("张二狗", "西红柿炒洋柿子");    }​    public static void useInterFour(InterFour interFour) {        String result = interFour.methodFour("大葱", "笨鸡蛋");        System.out.println("useInterFour Result:" + result);    }}​@FunctionalInterfaceinterface InterOne {    //无参无返回值的抽象方法    void methodOne();}​@FunctionalInterfaceinterface InterTwo {    //无参有返回值的抽象方法    Integer methodTwo();}​@FunctionalInterfaceinterface InterThree {    //有参无返回值的抽象方法    void methodThree(String name, String food);}​@FunctionalInterfaceinterface InterFour {    //有参有返回值的抽象方法    String methodFour(String foodOne, String foodTwo);}​

面试题:你开发的时候使用过Lambda吗? 【使用过!】

 
  面试题:有人说Lambda就是匿名内部类的代替的方式,你是否认同? 【不认同】    答案:(1)Lambda只能作用于接口,匿名内部类可以作用于抽象类【子类对象】/接口【实现类对象】/具体类【子类对象】    (2)Lambda只能作用于函数式接口【只能有一个抽象方法】,匿名内部类作用于接口【接口中可以有任意个数的抽象方法】    (3)匿名内部类本质上是通过语法底层生成一个.class文件,Lambda表达式不会额外生成.class文件【会在代码执行的时候动态编译】    (4)思想层面的不同,匿名内部类体现还是面向对象【对象】,Lambda表达式体现的是函数式思想【作为方法逻辑的载体而出现】        

Collection集合

Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。

Collection的常见方法如下:

迭代器概述

迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator

Collection集合获取迭代器的方法:

Iterator迭代器中的常用方法

★注意事项:一次hasNext方法搭配一次next方法(否则容易越界) 迭代器是一次性的

★注意事项:不推荐在迭代过程中使用集合修改集合长度,如果要删除元素可以通过迭代器。

遍历Collection集合的三种方法迭代器

 Collection names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");// 使用迭代器Iterator遍历集合中的元素Iterator iterator = names.iterator();while (iterator.hasNext()){    String next = iterator.next();    System.out.println(next);}

增强for循环

Collection names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");// 使用增强for循环遍历names集合for (String name: names) {    System.out.println(name);}

lambda表达式

Collection names = List.of("施恩", "徐宁", "郁保四", "李应", "周通", "公孙胜", "白胜", "汤隆", "张清", "皇甫端");​// 使用Lambda表达式循环遍历names集合names.forEach(element->{    System.out.println(element);});​names.forEach(new Consumer() {    @Override    public void accept(String s) {        System.out.println(s);    }});