Java总结13 Lambda表达式 和 方法引用 的概念与应用

一.Lambda表达式

一种代码简洁又抽象的表达方式,它能够在一个方法要调用某个接口的抽象方法前,对其要调用的抽象方法实现重写.
在这里插入图片描述
在这里插入图片描述

1.Lambda使用条件

在这里插入图片描述
1.必须要保证它是某个接口中唯一的一个抽象方法.即:无法用于存在多个抽象方法的接口
如:

interface InterA{
  void show();//Lambda表达式之 不带形参不带返回值的接口抽象方法
}

2.要有一个方法或一个对象/类的小括号’()'作为参数,让lambda的表达式填入其中.
如果是方法,则该方法必须同接口的抽象方法存在联系,比如该方法调用了接口的抽象方法
:

  public static void methodA(InterA a){
     a.show();
    }

Lambda标准格式:
在这里插入图片描述

方法名/对象名/new 类名((形参可选) -> {
//代码块(重写)
} );

列如:

  methodB((String str)->{

             System.out.println("methodB方法内,它用过'show'方法传递的字符串内容为:"+str);
             System.out.println("这里,我们其实已经重写了show方法,但重写是重写代码块儿,而并非是连同形参内容也给重写了");
             System.out.println("因此可以调用methodB方法中,给'show'传递的形参's'");
         });

2.Lambda的省略格式

在这里插入图片描述
省略规则一:当重写方法块仅一行代码时,可以省略大括号’{}’,当无参数时,不可以省略小括号’()'
格式:方法名/对象名/new 类名(() -> //代码块);
列如:methodA(() -> System.out.println("因为只有一行代码,在使用lambda表达式重写并实现某个抽象方法时,可以省略大括号"));
省略规则二:如果参数只有一个,可以省略括号’()’,仅写参数名即可.
注意:当重写方法没有参数时,小括号’()'不能省略

格式:方法名/对象名/new 类名(唯一参数-> //代码块);
列如: methodB(s-> System.out.println("重写方法,并打印's'字符串形参的内容:"+s));
省略规则三:可以省略参数类型,只填写参数名或者是其对应的数据,
注意:不可以单独省略某个参数的类型,要么都省略掉类型,要么都不省略.

格式:方法名/对象名/new 类名((参数1,参数2)-> //代码块);
列如:methodC((a,b)-> System.out.println("方法形参a的数值为"+a+",b的数值为"+b+",总和为"+(a+b)));
省略规则三:如果方法有返回值,且只有一行代码因而想要省略’大括号’的话,那么需要省略 其’return’单词.
格式:方法名/对象名/new 类名((参数)-> //return代码块);
列如:methodD((a,b)-> a+b);

二.方法引用

比较晦涩难懂,其实是程序根据你需要重写的内容和需求,将其送给Object或其子类/实现类中能够实现相似作用的类去实现.
即:将一个需求抛给一个已经存在的解决方案,可以是此前你自己写的类和方法,也可以是jdk中已有的类和方法.

1.引用类的静态方法

在这里插入图片描述
格式:方法名/对象名/new 类名(已知类::其类中的静态方法);
列如:methodLoadB(Math::max);

2.引用对象的成员方法

步骤1/ new对象
格式:对象类名 自定义对象名 = 对象类名(参数可选);
列如:Student st = new Student();

步骤2 正式引用
格式:方法名/对象名/new 类名(自定义对象名::成员方法);
列如:objLoad(st::nameToAgeOfString);
在这里插入图片描述

3.引用类的动态方法

格式:方法名/对象名/new 类名(已知类::其中的动态方法);
列如:classLoad(String::substring);
在这里插入图片描述

4.引用构造器(了解)

在这里插入图片描述
如(Stream流例子):team.map(Student::new).map(Student::toString).forEach(System.out::println);

public class StreamStudent {
    public static void main(String[] args) {
// 队伍1
        ArrayList<String> team1 = new ArrayList<>();
        team1.add("陈玄风");
        team1.add("梅超风");
        team1.add("风清扬");
        team1.add("解风");
        team1.add("风波恶");
        team1.add("陆乘风");
        team1.add("曲灵风");
        team1.add("武眠风");
        team1.add("冯默风");
        team1.add("陆小风");

// 队伍2
        ArrayList<String> team2 = new ArrayList<>();
        team2.add("宋远桥");
        team2.add("俞莲舟");
        team2.add("俞岱岩");
        team2.add("张松溪");
        team2.add("张翠山");
        team2.add("殷梨亭");
        team2.add("莫声谷");
        // 1、从第一个队伍中筛选出名字为3个字并且以“风”字结尾的人(Lambda表达式:返回名字长度为3,且后缀为风的字符串),筛选之后,只保留前6个。
        // 2、从第二个队伍中筛选出姓张的人员,筛选之后,不要第一个。 3、将两个筛选结果合并为一个队伍。
        //  4、将结果队伍中的字符串姓名作为Student对象的属性,创建Student对象,将集合中的元素都更改为Student类型。
        //   5、打印结果队伍的Student对象信息


        Stream<String> teamStreamOne = team1.stream().filter(s -> s.length() == 3 && s.endsWith("风")).limit(6);
        Stream<String> teamStreamTwo = team2.stream().filter(s -> s.startsWith("张")).skip(1);
        Stream<String> team = Stream.concat(teamStreamOne, teamStreamTwo);
        team.map(Student::new).map(Student::toString).forEach(System.out::println);

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值