Java8之——简洁优雅的Lambda表达式

  Java8发布之后,Lambda表达式,Stream等等之类的字眼边慢慢出现在我们字眼。就像是Java7出现了之后,大家看到了“钻石语法”,看到了try-with-resource等等。面对这些新东西,如果它能为我们提供方便带来不一样的改变。那么就值得去尝尝鲜。Java8出现了之后,我就扫了一眼新东西。但是实际工作中普遍使用的是Jdk1.7,1,6。所以就一直“闲置”了。而今闲了就看看。

  Lambda表达式是怎样的?

  下面将通过代码的形式来演示Lambda表达式,需要先安装JDK8.如果开发工具使用的是eclipse或者myeclipse的话,还需注意IDE的版本。版本低的还不支持Java8。

  

  Lambda表达式如何创建一个线程?

  我们知道创建线程有两种方式:

1.写一个类继承自Thread类,并实现run方法。然后,调用子类的start()方法启动线程。

2.实现Runable接口,并在run方法中写具体实现。将Runable的实现类 当做参数传递给Thread类的构造函数完成线程的创建。

第二种方法的实现写法可以如下:

       例1-1     Thread sayHello=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello");
            }
        });
        sayHello.start();

上面代码很简单,Thread构造函数中接收了一个匿名函数。匿名函数返回的是一个Runnable接口实现。启动线程之后,将会输出:hello信息。

上面例1-1 中的代码如果换成lambda表达式书写的话,就会是下面这个样子:

       例1-2     Thread thread=new Thread(()-> System.out.println("hello"));
        thread.start();

只有两行!怎么样?这一点有没有吸引到你。比起例1-1中的代码,例1-2更简洁,一目了然。这些改变就在于这一行代码:

()-> System.out.println("hello")

这就是一个Lambda表达式。它既是一个“参数”,更是一个“动作”。 第一次看的话,会觉得很奇怪,但是大概感受一下它的作用,便可以做出理解这整个动作:()表示实现的是一个无参的无返回值的方法。->后面指向的一句话 System.out.pringln("hello");这句代码是方法体的具体实现。这一理解就很顺了。下面再来看个例子。

  使用Lambda表达式实现文件过滤

  在File操作中我们可以实现  java.io.FileFilter 类来并在其accept 方法中编写过滤文件的代码实现。本例假设在windows系统中D盘有个文件夹resource,里边有若干一些文件,有.jc,.html,.doc 等各种格式。现在要选出js文件。实现如下:

例2-1        //1.文件目录
        File fileDir=new File("D:/resource");
        //2.创建筛选规则
        FileFilter filter=new FileFilter() {
            @Override
            public boolean accept(File file) {
                if(!file.isDirectory()&&file.getName().endsWith(".js")){
                    return true;
                }
                return false;
            }
        };
        //3.得到筛选文件
        File[] files=fileDir.listFiles(filter);
        

其实功能很简单,但是代码不少。如果不是你写的,而是你在阅读别人的代码,恐怕不是一眼能看出来的。还得从上到下,把这几行都看了。但是,如果是lambda表达式写的话就会使下面这个样子:

例2-2        //1.文件目录
        File fileDir=new File("D:/resource");
        //2.筛选
        File [] files=fileDir.listFiles((f)->!f.isDirectory()&&f.getName().endsWith(".js"));

怎么样,看起来是不是简洁多了。

(f)->!f.isDirectory()&&f.getName().endsWith(".js")

这一行就表到了上面4,5行的含义。因为括号中只有一个参数f,所以,也可以省去括号:

f->!f.isDirectory()&&f.getName().endsWith(".js")

写到这里。Lambda表达式的“长相”和“用途”已经展示出来了。个人感觉是优雅。只是初次看到的话,可能会觉得,一个括号,一个箭头。什么玩意。

但是当你理解了之后,看起来就会顺眼了。上面的两个例子,分别介绍了有参合无参,有返回值和无返回值的情况演示。基本够用了。具体编码用的时候,根据具体逻辑写实现就好了。例子中的lambda表达式是如下两种:

()-> xxx
(x,y)->x,y的处理

可以看到,结构为  三部分,箭头前的括号是方法头部分,箭头后面的是方法体实现。可以照葫芦画瓢,举一反三来写其他类型的lambda表达式写法。

1.如何理解lambda表达式。

答:其实就是一行代码,作为参数传递。既是一个参数,又是一组有“动作”的代码。

2.为什么例2-2中的代码,(f)  参数f参数类型都没有,一般的方法不都是指明参数类型的吗。这里都没说f是File类型的,为什么会不报错呢?

答:类型推断。

Lambda表达式的类型推断

未完。。后面再更新。

时间: 2024-10-13 12:16:19

Java8之——简洁优雅的Lambda表达式的相关文章

Java8新特性之:Lambda表达式

一. Lambda定义(λ): -- 匿名,它不像普通方法那样有一个明确的名称: -- 函数,它不像普通方法那样属于某个特定的类,但和方法一样,Lambda有参数列表.函数主体.返回类型或抛出异常列表: -- 传递,Lambda可以作为参数传递给方法或存储在变量中: -- 简洁. 二. Lambda表达式结构: 1. 参数列表: 2. 箭头:箭头->把参数列表与Lambda主体分隔开: 3. Lambda主体:表达式就是Lambda表达式的例子. 三.Lambda基本语法: (parameter

Java8新特性之一:Lambda表达式

Java8是自java5之后最重大的一次更新,它给JAVA语言带来了很多新的特性(包括编译器.类库.工具类.JVM等),其中最重要的升级是它给我们带来了Lambda表达式和Stream API. 1.什么是Lambda表达式? Lambda是一个匿名函数,可以理解为是一段可以传递的代码,可以将代码像传递参数.传递数据一样进行传输.使用Lambda表达式,可以写出更加紧凑.更加简洁.更加灵活的代码. 2.使用Lambda的限制条件 Lambda并不是任何地方都可以使用,Lambda表达式需要"函数

【Java8实战】Lambda表达式(一)

Java 8的Lambda表达式借鉴了C#和Scala等语言中的类似特性,简化了匿名函数的表达方式.Lambda表达式可以直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例.什么是函数式接口?简单来说就是只包含一个抽象方法的接口,允许有默认的实现(使用default关键字描述方法).函数式接口建议使用@FunctionalInterface注解标注,虽然这不是必须的,但是这样做更符合规范. 在Java 8之前,实现Runnable常用方式是编写一个匿名类: Thr

Java8 Lambda表达式详解手册及实例

先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下Java8的新特性.Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了. 现在进入正题Java8的Lambda,首先看一下发音 ([?l?md?])表达式.注意该词的发音,b是不发音的,da发[d?]音. 为什么要引入Lambda表达式 简单的来说,引入La

Java8 Lambda表达式深入学习(4) -- Java8实现方式

前几篇文章讨论了函数式接口和Lambda表达式语法.invokedynamic指令,以及Groovy2如何利用indy指令.本篇文章在前面几篇的基础之上,简要介绍Java8底层是如何实现Lambda表达式的. 示例代码 本文将以下面的代码为例展开讨论: import java.util.Arrays; import java.util.List; public class LambdaImplTest { public static void main(String[] args) { m1(A

Java8函数式接口以及lambda表达式实践

最近重新深入了解和学习了Java8的函数式接口以及lambda表达式,发现以前写的代码大多都是伪-函数表达式,因此重新精炼了一下的这部分代码,仅供参考,如有更好的方式,欢迎在评论区留言. 1.计算订单总金额 订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下 BigDecimal totalAmount = new BigDecimal(0); for (VenditionProduct venditionProduct : venditionVo.getVendition

行为参数化与lambda表达式 - 读《Java 8实战》

零. 概述 第一部分:1~3章 主要讲了行为参数化和Lambda表达式 第二部分:4~7章 主要讲了流的应用,包括流与集合差异,流的操作,收集器,注的并行执行 第三部分:8~12章 主要讲了怎样用Java8引入的特性改善老代码,Optional类和CompleteFuture及新的日期和时间API 第四部分:13~16章 主要讲了函数式编程 本文主要是对第一部分的笔记. 一.行为参数化 1.1 行为参数化定义 行为参数化就是拿出一个代码块,把它准备好却不去执行它. 1.2 举例:需求 有个果农,

在Android Studio中使用Lambda表达式

Lambda表达式是Java 8的一个新特性,可以替代只有一个函数的接口实现,告别匿名内部类,代码看起来更简洁易懂.Lambda表达式同时还提升了对集合的迭代.遍历.过滤数据的操作.那么在Android Studio中如何使用lambda表达式呢? 项目使用的jdk要为jdk 8或更高版本 修改build.gradle文件,enable jack和设置sourceCompatibility,targetCompatibility为jdk 8 defaultConfig { ... jackOpt

Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)——诺诺"涂鸦"记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  方法引用 (注:此文乃个人查找资料然后学习总结的,若有不对的地方,请大家指出,非常感谢!) 1.方法引用简述 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法.方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文.计算时,方法引用会创建函数式接口的一个实例. 当Lambda表达式中