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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何解决Nacos服务下线报错问题

    如何解决Nacos服务下线报错问题

    这篇文章主要介绍了如何解决Nacos服务下线报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java 选择、冒泡排序、折半查找(实例讲解)

    Java 选择、冒泡排序、折半查找(实例讲解)

    下面小编就为大家带来一篇Java 选择、冒泡排序、折半查找(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java数据结构-堆实现优先队列

    java数据结构-堆实现优先队列

    通常都把队列比喻成排队买东西,大家都很守秩序,先排队的人就先买东西。但是优先队列有所不同,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出,这篇文章主要介绍了java数据结构-堆实现优先队列,感兴趣的朋友一起看看吧
    2021-08-08
  • RxJava的消息发送和线程切换实现原理

    RxJava的消息发送和线程切换实现原理

    这篇文章主要介绍了RxJava的消息发送和线程切换实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Spring Boot实现功能的统一详解

    Spring Boot实现功能的统一详解

    这篇文章主要介绍了Spring Boot统一功能的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 基于Java实现空间滤波完整代码

    基于Java实现空间滤波完整代码

    空间滤波是一种采用滤波处理的影像增强方法。其理论基础是空间卷积和空间相关。这篇文章主要介绍了基于Java的空间滤波代码实现,需要的朋友可以参考下
    2021-08-08
  • Java的this关键字的使用与方法的重载相关知识

    Java的this关键字的使用与方法的重载相关知识

    这篇文章主要介绍了Java的this关键字的使用与方法的重载相关知识,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • SpringBoot实现跨域的几种常用方式总结

    SpringBoot实现跨域的几种常用方式总结

    跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,或者涉及到两个不同域名的资源之间的交互,由于同源策略(Same Origin Policy)的限制,浏览器不允许跨域请求,本文小编给大家分享了SpringBoot实现跨域的几种常用方式,需要的朋友可以参考下
    2023-09-09
  • Mybatis批量插入index out of range错误的解决(较偏的错误)

    Mybatis批量插入index out of range错误的解决(较偏的错误)

    这篇文章主要介绍了Mybatis批量插入index out of range错误的解决(较偏的错误),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java 将Excel转为SVG的方法

    Java 将Excel转为SVG的方法

    本文以Java示例展示如何将Excel文档转为SVG格式。通过本文中的方法,在将Excel转为SVG时,如果sheet工作表中手动设置了分页,则将每个分页的内容单独保存为一个svg文件,如果sheet工作表中没有设置分页,则将Excel sheet表格中默认的分页范围保存为svg。
    2021-05-05

最新评论