好炫的Lambda表达式,Java党用起来!(最简易Lambda教程)

刷微博时偶然看到Lambda 的 HelloWorld 教程,觉得很酷炫!分享一下!

效果示例

总体看起来效果就是代码简洁,如下

//之前的写法
btn.setOnClickListener(new View.OnClickListener() {
     @Override
      public void onClick(View v) {
          System.out.println("hello lambda");
          ...
      }
});

//Lambda表达式写法
btn.setsetOnClickListener((View v) -> {
          System.out.println("hello lambda");
          ...
      }
);
//之前的写法
new Thread(new Runnable() {
    @Override
     public void run() {
         System.out.println("hello lambda");
     }
}).start();

//Lambda表达式写法(只有一行内容可以去掉代码块大括号)
new Thread(() -> System.out.println("hello lambda")).start();

Lambda表达式模板

(T args) -> {
    //代码块
}

一个lambda expression由三部分组成:

- 参数:(T args)是这个lambda expression的参数部分,包括参数类型和参数名,可为空,小括号不可缺少

- 箭头:->,不可缺少

- 代码块:就是用”{}”包含着的代码。当代码块内代码只有一行时,花括号可以省略,且代码块内分号省略

原理

Lambda表达式不是新语法,是一种精简的字面写法,其实就是程序员可以把匿名内部类中“一定”要做的工作省略掉,然后由JVM通过推导把简化的表达式还原。

分步讲解

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students, new Comparator<Student>() {
        @Override
        public int compare(Student stu1, Student stu2) {
            return Integer.compare(stu1.age, stu2.age);
        }
    });
}

如上例子,第二个参数“一定”要为new Comparator<T>(){}类型,那么可以先去掉这第一个“一定”

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students,
        @Override
        public int compare(Student stu1, Student stu2) {
            return Integer.compare(stu1.age, stu2.age);
        }
    );
}

new Comparator<T>(){}里面“一定”要重写compare方法,并且“一定”返回int类型,那么方法名称也可以去掉

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students,
        (Student stu1, Student stu2) {
            return Integer.compare(stu1.age, stu2.age);
        }
    );
}

这个时候还是会报错,我们在参数列表和代码块之间加上箭头(->)就构成完整的Lambda表达式就能编译通过了。

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students,
        (Student stu1, Student stu2) -> {
            return Integer.compare(stu1.age, stu2.age);
        }
    );
}

如果代码块中只有一行代码的话,可以把大括号去掉,同时return去掉(因为compare方法一定返回int),而且这一行的最后的分号去掉。并且多余的空行可以合并为一行。

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students, (Student stu1, Student stu2) -> Integer.compare(stu1.age, stu2.age));
}

compare方法的参数列表中的参数类型“一定”是Arrays.sort()方法中第一个参数的类型,所以可以省略,因为JVM能够帮我们推导出来。

//对比两个学生的年龄
public void sort(Student[] students) {
    Arrays.sort(students, (stu1, stu2) -> Integer.compare(stu1.age, stu2.age));
}

简化完成!现在再来对比一下简化后和简化前的代码,你们感受一下

//对比两个学生的年龄
public void sort(Student[] students) {
    //简化前
    Arrays.sort(students, new Comparator<Student>() {
        @Override
        public int compare(Student stu1, Student stu2) {
            return Integer.compare(stu1.age, stu2.age);
        }
    });
    //简化后
    Arrays.sort(students, (stu1, stu2) -> Integer.compare(stu1.age, stu2.age));
}

其他效果

Lambda表达式也可以用于赋值。

Runnable r = () -> System.out.println("hello lambda");
new Thread(r).start();

Lambda使用限定

简单来说,下载最新的Eclipse就能支持Lambda语法。

我是Android党,Java 8以上才支持Lambda表达式,而Android最新只支持Java 7,如果Android中想使用的话,使用gradle-retrolambda插件。



最后还是推荐大家去看视频:《 Lambda 的 HelloWorld 视频教程》

Reference:

《 Lambda 的 HelloWorld 视频教程》

《Java 8的Lambda及其在Android 开发中的应用》

《如何在Android编程中使用Lambda表达式》

版权声明:本文为博主原创文章,转载请标明原文地址以及作者(阿曌)。

时间: 2024-10-15 20:50:31

好炫的Lambda表达式,Java党用起来!(最简易Lambda教程)的相关文章

精通lambda表达式:Java多核编程pdf

下载地址:网盘下载 内容简介  · · · · · · lambda表达式权威指南 <精通lambda表达式:Java多核编程>介绍Java SE 8中与lambda相关的特性是如何帮助Java迎接下一代并行硬件架构的挑战的.本书讲解了如何编写lambda.如何在流与集合处理中使用lambda,并且提供了完整的代码示例.你将学习如何通过lambda表达式充分利用当今多核硬件所带来的性能改进. 主要内容: ● 为何需要lambda,它将如何改变Java编程 ● lambda表达式语法 ● 流与管

Lambda表达式-Java

package com.sxt.thread; /** * Lambda表达式 简化线程(用一次)的使用 * */ public class LambdaThread { //静态内部类 static class Test implements Runnable{ public void run() { for(int i=0;i<20;i++) { System.out.println("一边听歌"); } } } public static void main(String[

java lambda表达式学习笔记

lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射人先射马,擒贼先擒王.学习一个库要学习它的入口类.lambda的入口类是Stream,一看Stream中的函数就会发现Function,Predicate等lambda元素. 一.几个概念     函数式接口 Functional Interface,除了static和default类型的方法外,只有一个函数

Lambda 表达式 in java 8

Lambda 表达式 in Java 8 Lambda表达式是java 8 新增的特性 Lambda表达式主要作用:支持将代码块作为方法参数,允许使用更简洁的代码创建函数式接口的实例,是匿名内部类的一种简化,可以部分取代匿名内部类的作用. 函数式接口:只有一个抽象方法的接口. Lambda表达式又称为匿名函数(anonymous function),表示一类无需定义标识符(函数名)的函数或者子程序,可以看做是一种语法糖. Lambda 表达式语法格式 Lambda表达式在java中由三部分组成:

Java 函数式编程和Lambda表达式

1.Java 8最重要的新特性 Lambda表达式.接口改进(默认方法)和批数据处理. 2.函数式编程 本质上来说,编程关注两个维度:数据和数据上的操作. 面向对象的编程泛型强调让操作围绕数据,这样可以实现以类为单位的重用,当为类添加新的数据类型时,原有代码无需修改. 函数式编程是一种不同的编程模型,它以操作(函数)为中心,强调变量不变性.函数式编程的准则是不依赖外部的数据,也不改变外部数据的值.这一特性满足了多核并行程序设计的需求,因此能简化并行程序开发. 函数式编程用函数来表达所有的概念,完

Java核心技术-接口、lambda表达式与内部类

本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内部类机制:内部类定义在另一个类的内部,其中的方法可以访问包含它们的外部类的域. 代理:一种实现任意接口的对象. 1 接口 1.1 接口的概念 概念:接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义. "如果类遵从某个特定的接口,那么就履行这项服务": Arrays

Java的Lambda表达式

Java的Lambda表达式 1. 什么是Lambda表达式 简单的说,Lambda表达式就是匿名方法.Lambda表达式让程序员能够使用更加简洁的代码,但是同样也使代码的可读性比较差. Lambda表达式也叫做匿名方法或者闭包. 2. 和匿名内部类做对比 Lambda是匿名方法,这个时候我们会想想到匿名内部类,我们来回想一下匿名内部类的用法,比如下面的代码就是使用匿名内部类实现了一个线程. public class Test { public static void main(String[]

Java 8——Lambda表达式

本篇文章不介绍Lambda的前世今生,这里只对Lambda表达的应用做详细了解.以及与内部类的差异点. Lambda表达式 Lambda表达式是Java SE 8版本中引入的新的语法糖.将功能看做方法参数,将代码看做数据. Lambda表达式语法: LambdaParameters -> LambdaBody Lambda表达式分为三部分: 参数列表 ->符号 函数体 如: () -> {} // 无参,返回结果为空 (x) -> System.out.println(x); //

Java函数式编程和lambda表达式

为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于某种语法或调用API去进行编程.例如,我们现在需要从一组数字中,找出最小的那个数字,若使用用命令式编程实现这个需求的话,那么所编写的代码如下: public static void main(String[] args) { int[] nums = new int[]{1, 2, 3, 4, 5,