Java中Lambda表达式的使用详解

 更新时间:2021年09月30日 15:23:09   作者:四季人06  
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑

理解函数式接口以及 Lambda表达式的发展过程

任何接口,只包含唯一一个抽象方法,就是函数式接口

/**
 * lambdab表达式的发展
 */
public class TestLambda1 {
    //3.静态内部类
    static class Like2 implements ILike{
        @Override
        public void lambda() {
            System.out.println("i like lambda2");
        }
    }

    public static void main(String[] args) {
        ILike like=new Like();
        like.lambda();

        like=new Like2();
        like.lambda();

        //4.局部内部类
       class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println("i like lambda3");
            }
        }
        like=new Like3();
        like.lambda();

        //5.匿名内部类
        like=new ILike() {
            @Override
            public void lambda() {
                System.out.println("i like lambda4");
            }
        };
        like.lambda();

        //6.用lambda简化
        like=()->{
            System.out.println("i like lambda5");
        };
        like.lambda();
    }
}

//1.定义一个函数式接口
interface ILike{
    void lambda();
}

//2.实现类
class Like implements ILike{

    @Override
    public void lambda() {
        System.out.println("i like lambda");
    }
}

Lambda表达式及语法

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

也就是说,不需要事先声明参数的类型,圆括号可以没有,大括号可以没有,返回值可以没有

一起来看看具体的使用

public class java8_Lambda_Test {
    public static final void main(String[] args) {

        Operator addOper = (a, b) -> a + b;
        Operator reduceOper = (a, b) -> a - b;
        Operator multiplyOper = (a, b) -> a * b;
        Operator DivideOper = (a, b) -> a / b;

        java8_Lambda_Test test = new java8_Lambda_Test();
        System.out.println(test.getResult(3, 3, addOper));//6
        System.out.println(test.getResult(3, 3, reduceOper));//0
        System.out.println(test.getResult(3, 3, multiplyOper));//9
        System.out.println(test.getResult(3, 3, DivideOper));//1
    }

    public int getResult(int a, int b, Operator operator) {
        return operator.convert(a, b);
    }

    public interface Operator {
        int convert(int a, int b);
        default int get(int a) {
            return a;
        }
    }
}

你需要注意什么

1.lambda 表达式只能引用标记了 final 的外层局部变量
2.可以直接在 lambda 表达式中访问外层的局部变量

Lambda的实际运用

1.对集合排序

问题描述:在一个存放了Student对象的list中,按年龄进行排序,输出排序后的list

Student类

public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Student student2) {
       int result =this.age - student2.age;
       return result;
    }
}
        List<Student> list=new ArrayList<>();
        Student s1=new Student();
        s1.setName("张三");
        s1.setAge(28);
        list.add(s1);
        Student s=new Student();
        s.setName("李四");
        s.setAge(22);
        list.add(s);
        sortUsingJava8(list);

        list.forEach((student) -> System.out.println(student.getName() + ":"+student.getAge()));
 // 使用 java 8 排序
    static void sortUsingJava8(List<Student> list){
        Collections.sort(list, (student1, student2) -> student1.compareTo(student2));
    }

来康康使用Java7进行排序是这样的:

    // 使用 java 7 排序
    private void sortUsingJava7(List<String> list){
        Collections.sort(list, new Comparator<String>() {
           @Override
           public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        });
    }

2.遍历集合

//先准备一个集合
        List<Student> list=new ArrayList<>();
        Student s1=new Student();
        s1.setName("张三");
        s1.setAge(28);
        list.add(s1);
        Student s=new Student();
        s.setName("李四");
        s.setAge(22);
        list.add(s);
//使用 lambda 表达式以及函数操作(functional operation)
  list.forEach((student) -> System.out.println(student.getName() + ":"+student.getAge()));

3.遍历集合(带条件)

 //带条件 打印年龄大于等于20的学生的姓名
        list.forEach((student)->{
            if (student.getAge()>=20)
                System.out.println(student.getName());
                });

4.代替 Runnable,开启一个线程

Runnable r = new Runnable() {
    @Override
    public void run() {
        //to do something
    }
};
Thread t = new Thread(r);
t.start();

现在这样写:

Runnable r = () -> {
    //to do something
};
Thread t = new Thread(r);
t.start();

你还可以这样写:

Thread t = new Thread(() -> {
    //to do something
    // such as for
    for(int i = 0; i < 100; i++){
        System.out.println(i);
           }
});
t.start;

到此这篇关于Java中Lambda表达式的使用详解的文章就介绍到这了,更多相关Java Lambda内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis如何解决sql中like通配符模糊匹配问题

    Mybatis如何解决sql中like通配符模糊匹配问题

    这篇文章主要介绍了Mybatis如何解决sql中like通配符模糊匹配问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 一文搞懂Runnable、Callable、Future、FutureTask及应用

    一文搞懂Runnable、Callable、Future、FutureTask及应用

    一般创建线程只有两种方式,一种是继承Thread,一种是实现Runnable接口,在Java1.5之后就有了Callable、Future,这二种可以提供线程执行完的结果,本文主要介绍了Runnable、Callable、Future、FutureTask及应用,感兴趣的可以了解一下
    2023-08-08
  • SpringData JPA审计功能(@CreatedDate与@LastModifiedDate)实现

    SpringData JPA审计功能(@CreatedDate与@LastModifiedDate)实现

    Spring Data JPA的审计功能提供了一种强大而灵活的机制,用于自动跟踪实体的创建和修改信息,通过使用@CreatedDate和@LastModifiedDate注解,开发者可以轻松地实现时间审计,感兴趣的可以了解一下
    2025-04-04
  • Elasticsearch Recovery索引分片分配详解

    Elasticsearch Recovery索引分片分配详解

    这篇文章主要为大家介绍了关于Elasticsearch的Recovery索引分片分配详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2022-04-04
  • SpringBoot全局配置long转String丢失精度问题解决方案

    SpringBoot全局配置long转String丢失精度问题解决方案

    这篇文章主要介绍了SpringBoot全局配置long转String丢失精度问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 使用dom4j实现xml转map与xml转json字符串

    使用dom4j实现xml转map与xml转json字符串

    这篇文章主要为大家详细介绍了如何使用dom4j实现xml转map与xml转json字符串功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-11-11
  • servlet监听实现统计在线人数功能 附源码下载

    servlet监听实现统计在线人数功能 附源码下载

    这篇文章主要为大家详细介绍了servlet监听统计在线人数的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 使用Java实现在Excel中添加动态数组公式

    使用Java实现在Excel中添加动态数组公式

    动态数组公式是 Excel 引入的一项重要功能,它允许用户从单个单元格中的公式返回多个结果值,并将这些值自动填充到与公式单元格相邻的单元格中,本文主要介绍了如何使用Java实现在Excel中添加动态数组公式,x需要的可以参考下
    2023-12-12
  • 基于springboot拦截器HandlerInterceptor的注入问题

    基于springboot拦截器HandlerInterceptor的注入问题

    这篇文章主要介绍了springboot拦截器HandlerInterceptor的注入问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring之InitializingBean接口和DisposableBean接口的使用

    Spring之InitializingBean接口和DisposableBean接口的使用

    这篇文章主要介绍了Spring之InitializingBean接口和DisposableBean接口的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论