Java 8之Lambda

本文探讨了Java 8引入的Lambda表达式,旨在使代码更简洁。Lambda是匿名方法,简化函数接口的编写,它由参数、箭头符号和方法体组成。通过实例展示了Lambda的使用,并指出其与函数接口的关联。尽管Lambda不是必需的,但它们为Java代码带来了更优雅的语法,减少了代码冗余。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司内部的一些新项目相继采用了Java 8,这才有了动力好好的研究一下Java 8这个传说中的大杀器。Java 8文档里面提到的第一个改进就是Lambda,就从它入手好了。社区好多大神都已经研究几年了,拜一下。有不准确的地方,望指正。

为什么要Lambda

把Java代码写得更简洁一点,更直白来说,就是写出来的代码篇幅更短。那么简单?核心来说,是的,不过可能额外带来一些好处。理论上来说,Lambda不是必需品,有了写的代码更优雅简练。Java最被诟病的问题之一就是代码量大(很多是无用的,只是语法要求这么干而已),Lambda能够给Java代码瘦瘦身。Java社区对Lambda的呼声一直很高,终于Java 8来了,项目中也陆续用起来。撒花…

Lambda到底是什么

Java中,Lambda是匿名方法,目的是简化函数接口(Functional Interface)的编写

  • 什么是函数接口?
    函数接口是一种特殊的接口,是只有一个抽象方法的接口
  • 什么是抽象方法?
    抽象方法是没有实现的方法,也就是方法参数后面没有跟大括号

所以,Java中任何Lambda必定有对应的函数接口,函数接口是Lambda的类型,Lambda是函数接口的实例。函数接口需要提前声明好,Lambda在使用的时候再写。好烦啊,用Lambda还得先写函数接口?是的,不过JDK设计的时候考虑到这一点,预先给大家提供了好几个常用的函数接口,都在java.util.function包下,比如Predicate,Consumer等。

Lambda语法

Lambda由三部分组成,参数,->,方法体

  • 参数
    (ParamType1 p1, ParamType2 p2, …)
    参数类型可省,变为(p1, p2, …)
    只有一个参数时括号也可省,p1

  • 方法体
    一个表达式或者一个语句块,return语句不必写
    表达式会有一个计算结果
    语句块用大括号括起来(可以写多条语句),只有一条语句并且函数接口的抽象方法的返回值为void时,大括号可省

Lambda例子

public class Lambda {
    public static void main(String[] args) {
        List<Material> materials = new ArrayList<Material>();
        materials.add(new Material());
        materials.add(new Material());
        materials.add(new Material());
        materials.add(new Material());
        materials.add(new Material());

        doSomthing(materials,
                (Material m) -> System.out.println("Print " + m.getId()));

    }

    public static void doSomthing(List<Material> materials,
            FunctionalInterfaceDemo demo) {
        for (Material material : materials) {
            demo.print(material);
        }
    }

    static class Material {
        public static int idStore = 1;
        private int id;

        public Material() {
            id = idStore++;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }
    }

    static interface FunctionalInterfaceDemo {
        void print(Material material);
    }
}

FunctionalInterfaceDemo就是函数接口。

结语

参数类型可以不写,刚开始时不习惯。不过JDK会在编译时推测Lambda对应的函数接口,从而知道抽象方法信息。另外注意Lambda不会生成一个新的scope(虽然有大括号),和Lambda所在的scope相同。Lambda虽然不是必需品,但也绝对不是奢侈品,其它语言都用好多年了,升到Java 8的同学用起来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值