Lambda表达式深入:

在上一次【http://www.cnblogs.com/webor2006/p/8135873.html】中介绍Lambda表达式的作用时,其中说到这点:

如标红处所说,既然Lambda表达式是一个对象,而且必须依附于一类特别的对象类型叫函数式接口,那么如果咱们给出了一个Lambda表达式,那这个表达式对应一个什么样的函数式接口呢?答案是:这个类型的判定必须依附于上下文,如果没有给出上下文,那么仅凭这个Lambda表达式是无法得知其具体是什么类型的,下面用代码来阐述一下:

接下来声明这两个函数式接口对应的Lambda表达式,因为Lambda表达式是可以生成函数式接口的实例方式之一,这里再将函数式接口实例的三种方法再贴出来,加深印象,因为确实非常重要:

接着继续编写代码:

发现这两处的Lambda表达式是一模一样的,如果单独写这样的一个Lambda表达式会怎么样呢?

其中上面说的上下文既为:

而如果木有上下文的Lambda表达式它到底是啥类型的,编译器是无法断定出来的,所以就会报错了。上下文这也是Java编译器对于Lambda表达式类型推断的一个非常重要的依据,实际上它就是去找目标函数式接口特定唯一的抽象方法,然后再找到抽象方法的参数、抽象方法的返回类型,而关于抽象方法到底是什么名字,对于Lambda表达式是毫无意义的:

当然啦,这个名称对于方法本身是意义的。

接下来用Lambda表达式来写一下线程的代码,因为在Java8中的Runnable接口已经声明为函数式接口了:

运行:

流初步:

先说一个小需求:将集合中的String变成大写,然后再输出出来,这里不用传统的方式去实现,而是采用Lambda表达式,这里用上次学过的forEach方法来进行元素遍历,具体如下:

编译运行:

这时需求发生了变化:不只是将元素以大写的形式打印出来,这里需要构造一个新的集合,然后里面存放的是转换成大写之后的元素,那首先new出来一个新的集合,这里先插播一个小插曲:

看一下IDE对这个变灰的提示:

所以按照提示来修正下代码:

回到正题,接下来则是遍历之后将转换后的大写字符串一个个添加到新集合中,如下:

乍一看这种实现貌似跟咱们传统的处理方式木有精简多少呀,不差不多嘛,下面再看一种新的方式,也就是采用Java8的流的方式,需要提醒的是这里只是对流进行一个初步引入,这是Java8中的一大专题涉及到的东东还不少,所以之后还会不断深入系统的学习它的,对于下面的代码有个初步认识既可,领略一下采用流的方式给咱们带来的便利性,那用流的方式倒底是怎么弄呢?

集合中有两个跟stream相关的方法,那这两者有啥区别呢?简单说:stream()方法是串行的,而parallelStream()是并行的,当然并行的效率要比串行的要高,这里先来看一下stream()方法是在哪里定义的:

再来看下该stream是一个默认方法,当然符合在接口中如果是具体方法一定得是默认方法的规定,下面读一下该方法的定义的javadoc,如下:

可以它确实是串行的方式,那继续看下下面的说明,不是很重要,做了解:

然后粗略的看一下具体实现:

上面仅做了解~~下面来看下如何利用stream来达到我们的要求:

来看一下Function接口的定义:

关于该函数式接口在之后会进行详细学习,这里先有个认识既可,所以代码可以这样来写:

这时已经将集合中的元素都转换成大写了,接着再对集合中的元素进行打印输出:

而具体Consumer的操作则是打印输出,如下:

接下来进一步改造一下,因为函数式接口还可以由方法引用来创建,so,

而点击"::"就能智能的跳到Function接口:

另外再看一下细节,对于map方法是需要接收一个Function函数式接口的实例的,而它里面apply接口的要求是要有一个输入参数和一个返回值的,那对于String的toUpperCase方法我们可以瞅一眼:

当然符合,不符合那编译器肯定直接报错了,其实是这样理解的,输入参数是调用了toUpperCase这个方法的那个对象,这个需要注意一下,输出返回值就是转换成大写的那个字串。

上面涌现出了很多新的知识点,不要着急~之后会一点点进行深入学习的~~

java8学习之Lambda表达式深入与流初步的更多相关文章

  1. JAVA8学习——深入浅出Lambda表达式(学习过程)

    JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在 ...

  2. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  3. java8学习之Lambda表达式继续探讨&Function接口详解

    对于上次[http://www.cnblogs.com/webor2006/p/8186039.html]已经初步引入的Java8中Stream流的概念,其中使用了map的操作,它需要接受一个Func ...

  4. Java8学习(3)- Lambda 表达式

    猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...

  5. java8学习之Lambda表达式初步与函数式接口

    对于Java8其实相比之前的的版本增加的内容是相当多的,其中有相当一大块的内容是关于Lambda表达式与Stream API,而这两部分是紧密结合而不能将其拆开来对待的,但是是可以单独使用的,所以从学 ...

  6. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

  7. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  8. Java8新特性 - Lambda表达式 - 基本知识

    A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...

  9. Java8简明学习之Lambda表达式

    函数式接口 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式转换为lambda表达式. 之前已有的函数式接口: java.lang.Runnable java.uti ...

随机推荐

  1. PJzhang:在windows10中实现右键命令行快捷打开

    猫宁!!! (windows10---设置---轻松使用---键盘---开启PrtScn快速截图),或者winodws+shift+s kali linux中右键就可以打开终端命令行. 采用手工修改注 ...

  2. powerDesigner关联数据库显示中文注释

    最近使用powerdesigner,遇到些问题,记录一下[安装过程就略过了] 一.安装odbc驱动 分享下驱动,百度网盘链接:https://pan.baidu.com/s/1UYPq_PEQkDOJ ...

  3. IDEA安装Git

    1.下载Git 官方地址为:https://git-scm.com/download/win 2.下载完之后,双击安装 3.选择安装目录 4.选择组件 5.开始菜单目录名设置 6.选择使用命令行环境 ...

  4. uboot传递参数'console=ttyXXX'的作用

    转载于:http://blog.csdn.net/jgdu1981/article/details/8643057 linux启动时uboot传递进console=ttyS0,115200n8的参数 ...

  5. tcpdump移植和使用

    转载于:http://blog.chinaunix.net/uid-30497107-id-5757540.html?utm_source=tuicool&utm_medium=referra ...

  6. *【Python】【demo实验31】【练习实例】【使用turtle画小猪佩奇】

    如下图小猪佩奇: 要求使用turtle画小猪佩奇: 源码: # encoding=utf-8 # -*- coding: UTF-8 -*- # 使用turtle画小猪佩奇 from turtle i ...

  7. 【转帖】Office的光荣历史(2)

    Office的光荣历史(2) https://www.sohu.com/a/201411215_657550 2017-10-31 10:57 7.MS Office 2000 (Office 9.0 ...

  8. Oracle 中 decode 函数用法(字段A,B, C,A不为空则取A,否则取B,B为空则取C)

    –decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值) SELECT DECODE(TEMP.SCORE, ‘A’, ‘90-100’, ‘B’, ‘80-89’, ‘C’, ...

  9. linux终端命令(四)系统信息相关命令(五)其他命令

    四.系统信息相关命令 时间和日期 date cal 磁盘和目录空间 df du 进程信息 ps top kill 1.时间和日期 序号 命令 作用 01 cal 查看日历,-y选项可以查看一年的日历 ...

  10. Win32汇编语言语法基础

    汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...