概念说明

  • Lambda表达式是Java8提供的新特性,支持将代码块作为方法的参数。
  • Lambda表达式支持使用简洁的代码创建只有一个方法的接口(函数式接口)。
  • 只包含一个方法的接口也称为函数式接口。

Lambda表达式示例

在命令模式的例子中(地址:http://www.cnblogs.com/rask/p/8309876.html),可以直接向业务处理类方法传入实际代码,有两种实现方式:局部匿名内部类和Lambda表达式。

public class Test {
public static void main(String[] args) {
DataProcess dp = new DataProcess();
int[] data = { 1, 2, -10, 9, 18 }; // 使用局部内部类
dp.service(data, new ICommand() {
@Override
public void process(int[] data) {
System.out.print("数组data中的元素有:");
for (int item : data) {
System.out.print(item + " ");
}
}
}); // 使用lambda表达式
dp.service(data, target -> {
int sum = 0;
for (int i = 0; i < target.length; i++) {
sum += data[i];
}
System.out.println("数组所有元素之和为:" + sum);
});
}
}

 Lambda表达式的主要作用:用于替换匿名内部类繁琐的语法。

Lambda表达式语法格式

(参数类型 参数1,参数类型,参数2)->{代码块}
  1. 形参列表:允许省略形参参数类型。如果只有一个参数,圆括号也可以省略。
  2. “->” :使用英文的中画线和大于号表示。
  3. 代码块:如果代码块只有一条语句,可以省略"{}"。如果代码块只有一条return语句,return关键字也可以省略。

示例代码:

package com.etc.qs;

/**函数式接口*/
@FunctionalInterface
interface OneAble {
void method();
} /**函数式接口*/
@FunctionalInterface
interface TwoAble {
void method(String str);
} /**函数式接口*/
@FunctionalInterface
interface ThreeAble {
int method(int a, int b);
} public class QSDemo { public void OneAbleImpl(OneAble oneAble) {
System.out.println(oneAble.toString());
oneAble.method();
} public void TwoAbleImpl(TwoAble twoAble) {
System.out.println(twoAble.toString());
twoAble.method("Hello Lamda!");
} public void ThreeAbleImpl(ThreeAble threeAble) {
System.out.println("10和15的和为:" + threeAble.method(10, 15));
} public static void main(String[] args) {
QSDemo q = new QSDemo();
// Lambda表达式代码块只有一条语句,可以省略"{}"
q.OneAbleImpl(() -> System.out.println("新年好!")); // Lambda表达式的形参列表只有一个形参,可以省略"()"
q.TwoAbleImpl(str -> {
System.out.println(str);
System.out.println("执行了一个参数的方法!");
}); // Lambda表达式代码块只有一条语句,可以省略"{}",如果该条语句为带返回值,同时可以省略return关键字
q.ThreeAbleImpl((a, b) -> a + b); }
}

  

函数式接口

Lambda表达式的类型,也称为“目标类型”。Lambda表达式的目标类型必须是“函数式”接口(functional interface)。

函数式接口:只有一个抽象方法的接口。这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。

Java8提供了函数式接口注解:

@FunctionalInterface

  该注解用于编译时检查接口是否满足函数式接口规范。

总而言之,Lambda表达式使用限制归纳为以下两点:

  • Lambda表达式目标类型必须是函数式接口。
  • Lambda只能为函数式接口创建对象。

Lambda表达式方法引用和构造器引用

如果Lambda表达式代码块只有一条语句,可以在代码中使用方法引用和构造器引用,使用”::”进行引用。

引用方式汇总:

种类 引用示例 说明 对应Lambda表达式
引用类方法 类名::类方法 函数式接口中被实现方法的全部参数传给该类方法作为参数 (a,b,...)->类名.类方法(a,b,...)
引用特定对象的实例方法 特定对象::实例方法  函数式接口中被实现方法的全部参数传给该方法作为参数 (a,b,...)->特定对象.实例方法(a,b,...)
引用某类对象的实例方法 类名::实例方法  函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数  (a,b,...)->a.实例方法(b,...)
引用构造器 类名::new  函数式接口中被实现方法的全部参数传给该构造器作为参数  (a,b,...)->new 类名(a,b,...) 

表格数据来源:《疯狂java讲义》

引用类方法示例代码:

/**
* 函数式接口
* 用于把字符串转换为整数
*
*/
@FunctionalInterface
interface Converter{
Integer convert(String from);
} public class MethodRef {
public static void main(String[] args) {
//Converter converter=(String from)->{return Integer.valueOf(from);};
Converter converter=Integer::valueOf;//引用类方法valueOf
Integer val=converter.convert("8899");
System.out.println(val);
}
}

  

引用特定对象的实例方法示例代码:

/**
* 函数式接口1
* 判断字符串中是否包含指定字符
*
*/
@FunctionalInterface
interface Converter1{
int convert(String from);
} public class MethodRef {
public static void main(String[] args) {
Converter1 converter1="etc.com"::indexOf;//indexOf为String类的实例方法
int result=converter1.convert("c");
System.out.println(result);
}
}

  

引用某类对象的实例方法示例代码:

/**
* 函数式接口2
* 字符串截取
*
*/
@FunctionalInterface
interface Converter2{
String convert(String from,int a,int b);
} public class MethodRef {
public static void main(String[] args) {
Converter2 converter2=String::substring;//引用String类的实例方法
String result=converter2.convert("etc.com",2,4);
System.out.println(result);
}
}

  

引用构造器示例代码:

/**打开一个Frame窗体*/
@FunctionalInterface
interface MyFrame {
JFrame windows(String title);
} public class MethodRef {
public static void main(String[] args) {
MyFrame mf=JFrame::new;//引用JFrame类的构造器
JFrame jf=mf.windows("我的窗体");
jf.setVisible(true);
jf.setSize(400, 400);
}
}

  

JavaSE-29 Java8的Lambda表达式的更多相关文章

  1. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 //Before Java 8: new Thread(new Runnable() { @Overri ...

  2. java8的lambda表达式,将List<DTO> 转为 List<DO>

    将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...

  3. java8的lambda表达式

    关于java8的lambda表达式 lambda表达式一般用于接口,因为lambda表达式是函数式编程. 1.有且仅有一个抽象方法被称为函数式接口,函数式接口可以显示的被@FunctionalInte ...

  4. Java8的Lambda表达式简介

    先阐述一下JSR(Java Specification Requests)规范,即Java语言的规范提案.是向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求 ...

  5. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  6. java8之lambda表达式(1)-基本语法

    lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double ...

  7. java8之lambda表达式入门

    1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ privat ...

  8. JAVA8之lambda表达式具体解释,及stream中的lambda使用

    前言: 本人也是学习lambda不久,可能有些地方描写叙述有误,还请大家谅解及指正! lambda表达式具体解释 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.l ...

  9. 十分钟学会Java8的lambda表达式和Stream API

    01:前言一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序.过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照. 刚开始写写是打基础,但写的多了,各种乏 ...

  10. java8中Lambda表达式和Stream API

    一.Lambda表达式 1.语法格式 Lambda是匿名函数,可以传递代码.使用“->”操作符,改操作符将lambda分成两部分: 左侧:指定了 Lambda 表达式需要的所有参数 右侧:指定了 ...

随机推荐

  1. Python 赋值、浅拷贝和深拷贝

    初学Python,和C++还是有许多不同.直接赋值.浅拷贝和深拷贝,这三种拷贝对象的操作之间还是有许多的区别.Python语言的版本为2.7,在Pycharm中进行实验. 一.直接赋值 用下面的代码来 ...

  2. Gym 100299C && UVaLive 6582 Magical GCD (暴力+数论)

    题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点 ...

  3. 关于js变量作用域

    先来看一段代码 var ss=1;function sss(){ alert(ss);}$(document).ready(function(){ var ss=2; alert(ss); sss() ...

  4. 3DMAX 合并镜像物体

    如果镜像文件是实例,那么就不能用附加选项,所以可以先删除一半,再copy镜像出来,然后点选可编辑网格,在一个物体上选附加,再点选另一半即可

  5. hdu 1028 Ignatius and the Princess III【生成函数】

    老是想着化简,实际上O(n^3)就行了-- 写成生成函数是\( \prod_{i=1}^{n}(1+x^i+2^{2i}+...+x^{ \left \lfloor \frac{n}{i} \righ ...

  6. 鸟哥私房菜基础篇:Linux 的档案权限与目录配置习题

    猫宁!!! 参考链接:http://linux.vbird.org/linux_basic/0210filepermission.php 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-早期的 Uni ...

  7. robotframework自动化系列:文本类型的下拉框

    对于下拉框定位和输入,这里主要遇到有两种类型的下拉选择. 其中一个类型是select-options格式,如图 这种方式的定位可以使用select from list by value或select ...

  8. 突然所有命令都不能用了, /usr/bin不在path里 .bashrc文件

    export PATH=/usr/bin:/bin .bashrc文件中多一个空格都不行啊所有的问题都是因为复制的时候多了空格,简直无语,用了两个小时

  9. 布线问题 最小生成树 prim + kruskal

    1 : 第一种 prime     首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...

  10. Beta版本冲刺第一天!

    该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址:https://edu.cnblogs.com/c ...