lambda表达式

Lambda表达式学习笔记

1.为什么使用Lambda?

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升

2.Lambda表达式使用举例

package com.deng;

import org.junit.Test;

import java.util.Comparator;

/**
 * Lambda表达式使用举例
 * @author Deng Huawei
 * @create 2021-04-09 12:36
 */
public class TestLambda {

    @Test
    public void test1(){
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("This is a test!");
            }
        };
        r1.run();
        System.out.println("--------------------下面是Lambda表达式---------------------");
        Runnable r2 = () -> System.out.println("This is a Lambda test!");
        r2.run();
    }

    @Test
    public void test2(){
        Comparator<Integer> cmp1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        int compare1 = cmp1.compare(12,10);
        System.out.println(compare1);
        System.out.println("--------------------------Lambda-------------------");
        Comparator<Integer> cmp2 = (o1,o2) -> Integer.compare(o1,o2);
        int compare2 = cmp2.compare(21,32);
        System.out.println(compare2);
        System.out.println("--------------------------方法引用-------------------");
        Comparator<Integer> cmp3 = Integer::compare;
        int compare3 = cmp3.compare(21,32);
        System.out.println(compare3);
    }
}

3.Lambda表达式语法使用

3.1.举例

(o1,o2) -> Integer.compare(o1,o2);

3.2.格式

  • -> :lambda操作符,或箭头操作符
  • ->左边:lambda形参列表(其实就是接口中的抽象方法形参列表)
  • ->右边:lambda体 (其实就是重写的方法的方法体)

3.3.Lambda表达式的使用(6种情况)

  • 语法格式1:无参,无返回值(上面的Runnable方法!!)

    @Test
    public void test1(){
        Runnable r1 = () -> {System.out.println("This is a test!");}
        r1.run();
    }
    
  • 语法格式2:Lambda需要一个参数,但是没有返回值

    @Test
    public void test2(){
        Consumer<String> con1 = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con1.accept("普通方法!");
        System.out.println("**************************");
        Consumer<String> con2 = (String s) -> {
            System.out.println(s);
        };
        con2.accept("lambda表示方法!");
    } 
  • 语法格式3: 数据类型可以省略,因为可由编译器推断得出,称为“类型推断“
   //语法格式3:数据类型可以省略,因为可由编译器推断得出,称为“类型推断“
    @Test
    public void test3(){
        Consumer<String> con2 = (String s) -> {
            System.out.println(s);
        };
        con2.accept("lambda表示方法!");
        System.out.println("*************************优化!!");
        Consumer<String> con3 = (s) -> {
            System.out.println(s);
        };
        con2.accept("lambda表示优化方法!类型推断!!!");
    }

类型推断:

 ArrayList<String> arrayList = new ArrayList<>();   //类型推断
        int[] arr = new int[]{12,2,3,};    //可改为
        int[] arr1 = {1,2,3};               //类型推断
  • 语法格式4:Lambda 若只需要一个参数时,参数的小括号可以省略

    //语法格式4:Lambda 若只需要一个参数时,参数的小括号可以省略
    @Test
    public void test4(){
        Consumer<String> con3 = (s) -> {
            System.out.println(s);
        };
        con3.accept("lambda表示优化方法!类型推断!!!");
        System.out.println("***************************");
        Consumer<String> con4 = s-> {
            System.out.println(s);
        };
        con4.accept("lambda表示优化方法,类型推断!!!去掉小括号");
    }
    
  • 语法格式5:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值

    //语法格式5:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
    @Test
    public void test5(){
        Comparator<String> com1 = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(com1.compare("12", "21"));
        System.out.println("原始写法****************************");
    
        Comparator<String> com2 = (o1,o2) ->{
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com1.compare("12", "6"));
    }
    
  • 语法格式6:当:Lambda体只有一条语句时,return与大括号若有,都可以省略

    //语法格式6:当:Lambda体只有一条语句时,return与大括号若有,都可以省略
    @Test
    public void test6(){
        Comparator<Integer> com1 = (o1,o2) ->{
            return o1.compareTo(o2);
        };
        System.out.println(com1.compare(12,6));
        System.out.println("*******************************");
        Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);  //System.out.println();
        System.out.println(com2.compare(60,63));
    }
    

3.4.Lambda表达式本质

作为接口的实例(具体实现类)

4.总结

  • ->左边:lambda形参列表的参数类型可以省略(类型推断);如果参数列表只有一个参数,其一对()也可以省略

  • ->右边:lambda体应该使用一对{}进行包裹,如果lambda体只有一条执行语句(可能是return语句),可以省略一对{}以及这个return关键字(注意:省了{}一定要去掉return);

重点!!!!需要 接口只有一个抽象方法,依赖于函数式接口!!!!!!!!!!!!!!

5.练习

将Employee按照年龄进行排序,如果年龄相同,则按照姓名进行排序。提示:Collections.sort()

public class test {
    List<employee> list = Arrays.asList(
            new employee(1,"张三",18,2000),
            new employee(2,"李四",25,2011),
            new employee(3,"王五",20,3000),
            new employee(4,"孙武路",23,3000),
            new employee(5,"张无忌",30,5000)
    );

    @Test
    public void test(){
        Collections.sort(list, (e1,e2) -> {
            if(e1.getAge() == e2.getAge()){
                return e1.getName().compareTo(e2.getName());
            }else {
                return Integer.compare(e1.getAge(),e2.getAge());
            }
        });
        for (employee emp : list) {
            System.out.println(emp);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值