一、lambda表达式

一个lambda表达式包含三个部分:

  • 一段代码
  • 参数
  • 自由变量的值,这里的自由指的是哪些不是参数并且没有在代码中定义的变量。

示例:

public static void repeat(String text, int count) {
Runnable r = () -> {
for (int i = 0; i < count; i++) {
System.out.println(text);
Thread.yield();
}
}; new Thread(r).start();
}

含有自由变量的代码块被称为“闭包”。

内部类也会补货闭合作用域中的值。在Java 8之前,内部类只允许访问final的局部变量。为了适应lambda表达式,这条规则也被放宽了。一个内部类可以访问任何有效的final局部变量--即任何值不会发生变化的变量。

二、默认方法

public interface DefaultDemo {
long getId(); default String getName(){
return "name";
};
}

默认方法终结了以前的一种经典模式,即提供一个接口,以及一个实现接口的大多数或全部方法的抽象类,例如Collection/AbstractCollection。现在你只需要在接口中实现那些方法。

如果一个接口中定义了一个默认方法,而另一个父类或者接口中又定义了一个同名的方法,该选择哪个呢?Java中的规则要简单得多,如下:

  • 选择父类中的方法。如果一个父类提供了具体的实现方法,那么接口中具有相同名称和参数的默认方法会被忽略。
  • 接口冲突。如果一个父接口提供了一个默认方法,而另一个接口也提供了一个具有相同名称和参数类型的方法(不管是不是默认方法),那么你必须通过覆盖该方法来解决冲突。

三、方法引用

表达式System.out::println是一个方法引用,等同于lambda表达式x -> System.out.println(x)。

::操作符将方法名和对象或类的名字分隔开来。以下是三种主要的使用情况:

  • 对象::实例方法
  • 类::静态方法
  • 类::实例方法

例如:Math::pow等同于(x,y)->Math.pow(x,y),String::compareToIgnoreCase等同于(x,y)->x.compareToIgnoreCase(y)。

注意:如果有多个同名的重载方法,编译器会试图从上下文中找到最匹配的一个方法。例如,有两个版本的Math.max方法,一个接收整型作为参数,而另一个接收double类型的值。究竟会选择哪一个方法取决于Math:max被转换为的函数式接口的方法参数。同lambda表达式类似,方法引用也不会独立存在,他们经常被用于转换为函数式接口的实例。

Java 8学习之Lambda表达式的更多相关文章

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

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

  2. Java函数式编程和lambda表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

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

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

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

    本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...

  5. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

  6. java函数式编程之lambda表达式

    作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...

  7. 最全最强 Java 8 - 函数编程(lambda表达式)

    Java 8 - 函数编程(lambda表达式) 我们关心的是如何写出好代码,而不是符合函数编程风格的代码. @pdai Java 8 - 函数编程(lambda表达式) 简介 lambda表达式 分 ...

  8. Java 8:掌握 Lambda 表达式

    本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...

  9. Java学习笔记-Lambda表达式

    Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数是接口)的实例 意义 自从Java 8开始,Java支持Lambda表达 ...

随机推荐

  1. Linux 基础教程 26-基础网络配置

    基本配置     要想上网,计算机需要有专门的网络连接设备,即网络接口卡或者网卡.网卡按照与计算机主机的连接方式可以分为PCI网卡.ISA网卡及无线网卡(USB网卡)等.在Linux中可以使用命令ls ...

  2. (广搜)聪明的打字员 -- POJ --1184

    链接: http://poj.org/problem?id=1184 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#probl ...

  3. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果

    目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果. 如果 ...

  4. DI延伸

    延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属 ...

  5. Android-DateTimeAndroidUtil-工具类

    DateTimeAndroidUtil-工具类 是关于时间日前相关的公用方法: package liudeli.mynetwork01.utils; import android.util.Log; ...

  6. java-01 JAVA三大版本比较&JDK、JRE、JVM 的关系

    1. java三大版本比较 1.1 java SE javaSE 是java标准版的简称,其定位是个人计算机应用(应用原生界面比较ugly) 全称:Java Platform Standard Edi ...

  7. 在TFS 2013中选择一周中的工作日,例如增加星期日

    默认情况下,TFS在迭代视图中不计算周末的工作,如果出现调休的情况,则周末的工作日不会出现在迭代视图中,也不会参与燃尽图的计算.但是可以调整团队一周中的工作日,从而修正迭代计算方式,修改的方式参考下图 ...

  8. 疑难杂症--SQL SERVER 18056的错误

    朋友遇到一个很棘手的问题,查看服务器日志,报以下错误: ::,spid296,未知,错误: ,严重性: ,状态: . ::,spid495,未知, The client was unable < ...

  9. XML--将XML中数据提取出转换成表2

    DECLARE @xml XMLSET @xml = '<Students>    <Student  id="1001" name = "xu&quo ...

  10. Jenkins的多个任务并串联参数传递

    Jenkins的多个任务并串联参数传递 Parameterized Trigger Plugin插件可以使多个job连接的时候可以传递一些job相关的参数信息. 1.Parameterized Tri ...