3分钟入门lambda表达式

本节是lambda表达式的一个入门课,讲解的同时配有练习demo

前言什么是lambda表达式?基础语法函数式接口自己实现一个函数式接口jdk提供的函数式接口ConsumersupplierfunctionPredicate其他场景

前言

  lambda表达式是java8推出的一个新特性。标志着从jdk1.8开始,java正式支持函数式编程。使用lambda表达式可以用简洁流畅的代码完成一个功能,这也在一定程度上,可以减轻了java一直为人诟病的代码简洁性问题。


什么是lambda表达式?

  lambda表达式可以简单理解为一段可以传递的代码,核心思想是将面向对象中传递数据变为传递行为。下面举一个编写线程的例子。

1Runnable runnable = new Runnable() {2  @Override3  public void run() {4    System.out.println("hello lambda");5  }6};

  这里使用的是匿名内部类的方式。匿名内部类实现的也是将代码作为数据传递,不过使用匿名内部类还是不够简洁,那么使用lambda表达式的代码是什么样的呢?

1Runnable runnable = () -> System.out.println("hello lambda");

  我们可以看到使用lambda表达式实现起来非常的简单,只需要一行代码即可,接下来我们就试着分析一下这段代码。


基础语法


  我们可以将lambda表达式整体看作是一个函数,()存放的是函数的操作数 ->指向的是函数的逻辑,可以用{}包裹起来。


函数式接口

  我们可以看到上述的示例代码,lambda表达式的引用变量是一个runnable类型,事实上,java为我们提供了多种变量类型供我们选择,这些类型我们称之为函数式接口。
  函数式接口是只有一个方法的接口,用作lambda表达式的类型。比如我们之前提到的Runnable接口

 1@FunctionalInterface 2public interface Runnable { 3    /** 4     * When an object implementing interface <code>Runnable</code> is used 5     * to create a thread, starting the thread causes the object‘s 6     * <code>run</code> method to be called in that separately executing 7     * thread. 8     * <p> 9     * The general contract of the method <code>run</code> is that it may10     * take any action whatsoever.11     *12     * @see     java.lang.Thread#run()13     */14    public abstract void run();15}

  我们可以看到interface上一个注解@FunctionInterface,它的作用是告诉编译器这个接口是一个函数式接口。


自己实现一个函数式接口

  我们可以自己实现一个函数式接口,判断数据的数据是否合法

 1/** 2 * 自定义函式数接口 3 * 4 * @author jialin.li 5 * @date 2020-03-18 14:22 6 */ 7@FunctionalInterface 8public interface CustomFunctionInterface<T> { 9    boolean legal(T t);10}

测试方法:

 1/** 2 * 测试. 3 *  4 * @author jialin.li 5 * @date 2020-03-18 14:23 6 */ 7public class Test { 8 9    public boolean legal(int value, CustomFunctionInterface<Integer> functionInterface){10        return functionInterface.legal(value);11    }1213    public static void main(String[] args) {14        System.out.println(new Test().legal(-8, (x) -> x >= 0));15    }16}

测试结果:

1false

jdk提供的函数式接口

  jdk在java.util.function中为我们提供了非常丰富的函数式接口,大致可以分为4类:


  接下来我们会针对这四种不同的接口,给出相应的demo,你也可以先看题目,自己尝试写一下

Consumer

将输入的10进制数,转换为2进制数输出

1public void toBinaryString(int value, Consumer<Integer> consumer){2    consumer.accept(value);3}45public static void main(String[] args) {6    new Test().toBinaryString(15, (x) -> System.out.println(Integer.toBinaryString(x)));7}

supplier

生成n个随机数100以内的随机数,以数组的形式返回

 1public int[] getRandomArr(int n, Supplier<Integer> supplier) { 2    int[] arr = new int[n]; 3    for (int i = 0; i < n; i++) { 4        arr[i] = supplier.get(); 5    } 6    return arr; 7} 8 9public static void main(String[] args) {10    int[] arr = new Test().getRandomArr(10, () -> new Random().nextInt(100));11    System.out.println(Arrays.toString(arr));12}

function

生成一个[1,n]组成的阶乘数组,例如输入3,返回[1,4,9]

 1public int[] getFactorialArr(int n, Function<Integer,Integer> function) { 2    int[] arr = new int[n]; 3    for (int i = 1; i <= n; i++) { 4        arr[i - 1] = function.apply(i); 5    } 6    return arr; 7} 8 9public static void main(String[] args) {10    int[] arr = new Test().getFactorialArr(10, (x) -> x*x);11    System.out.println(Arrays.toString(arr));12}

Predicate

判断一个数是否是偶数

1public boolean isEven(int n, Predicate<Integer> predicate) {2    return predicate.test(n);3}45public static void main(String[] args) {6    boolean isEven = new Test().isEven(1102, (x) -> (x % 2 == 0));7    System.out.println(isEven);8}

其他场景

  除了上述的4个接口,java.util.function中还有许多其他的接口,可以实现各种功能。比如实现2个数的加法运算:

1public static void main(String[] args) {2    BinaryOperator<Integer> binaryOperator = Integer::sum;3    System.out.println(binaryOperator.apply(1, 3));4}

  实现List遍历:

1public static void main(String[] args) {2    List<String> list = new ArrayList<>(Arrays.asList("java", "python", "go", "sql"));3    list.forEach(System.out::println);4}

  更多场景还请您去探索,感受函数式编程的魅力吧

  最后,期待您的订阅和点赞,专栏每周都会更新,希望可以和您一起进步,同时也期待您的批评与指正!

原文地址:https://www.cnblogs.com/nedulee/p/12520362.html

时间: 2024-10-11 01:50:25

3分钟入门lambda表达式的相关文章

深入浅出lambda表达式--零基础一分钟入门

lambda从使用上来说,第一感觉直白的理解就是,少了很多不必要的匿名回调类的写法,比如: public static void main(String[] args) { PlatformQuery query = new PlatformQuery().createDemo(); Runnable c = () -> { System.out.println(JsonUtils.toJson(query)); }; Thread thread = new Thread(c); thread.

Java8 Lambda表达式入门

Lambda表达式的实质就是一个匿名函数.C#3.0引入了Lambda表达式,Java8也不甘示弱.Java8发布很久了,今天安装了JDK体验了Java8中的Lambda表达式. 首先看一个不适用Lambda表达式的例子. 比如我们要对一组字符串进行排序. public class Hello { public static void main(String[] args) { List<String> names = Arrays.asList("Tan", "

Java Lambda表达式入门[转]

原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示例程序 Examples.zip .原文日期: 2014年4月16日 翻译日期: 2014年4月27日翻译人员: 铁锚简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要

entity framework 新手入门篇(1.5)-lambda表达式与linq

在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以lambda表达式为例: x=>x+1;就是一个完整的lambda表达式. 其等同于一个匿名的方法: int anonymous(int x) { return x+1; } 考虑一下这个方法中最重要的部分,也就两个部分:传入的参数,返回的参数. 返回值类型,参数类型都是可以进行推断的,就像C#中的VA

Java Lambda表达式入门

原文链接: Start Using Java Lambda Expressions 下载示例程序 Examples.zip . 原文日期: 2014年4月26日 翻译日期: 2014年4月27日 翻译人员: 铁锚 简介 (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因为这就和某些很高级的黑客写的代码一样,简洁,难懂,难以调试,维护人员想骂娘.) Lambda表

python3 入门 (三) 函数与lambda表达式、闭包

函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明 函数内容以冒号起始,并且缩进 Return[expression]结束函数,选择性地返回一个值给调用方.不带表达式的return相当于返回 None 函数的定义: 1 def test0(): 2 "函数_文档字符串" 3 pri

Lambda表达式入门

Lambda表达式是Java 8的重要更新,也是一个被广大开发者期待已久的新特性,Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例. Lambda表达式的主要作用就是代替匿名内部类的烦琐语法,它由三部分组成: 1.形参列表(参数),形参列表允许省略形参类型.如果形参列表中只有一个参数.甚至连形参列表的圆括号也可以省略: 2.箭头(->),必须通过英文中划线号和大于号组成: 3.代码块,如果代码块中只有

java8之lambda表达式入门

1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public String getName() { ret

30 分钟 Java Lambda 入门教程

Lambda简介 Lambda作为函数式编程中的基础部分,在其他编程语言(例如:Scala)中早就广为使用,但在Java领域中发展较慢,直到java8,才开始支持Lambda. 抛开数学定义不看,直接来认识Lambda.Lambda表达式本质上是匿名方法,其底层还是通过invokedynamic指令来生成匿名类来实现.它提供了更为简单的语法和写作方式,允许你通过表达式来代替函数式接口.在一些人看来,Lambda就是可以让你的代码变得更简洁,完全可以不使用——这种看法当然没问题,但重要的是lamb