第十四章——lambda表达式与流处理

第十四章——lambda表达式与流处理_第1张图片

一:lambda表达式

1.lambda 表达式简介

        lambda表达式可以用非常少的代码实现抽象方法。lambda 表达式不能独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。

语法格式如下:

() -> 结果表达式
参数 -> 结果表达式
(参数1,参数2,...,参数n) -> 结果表达式

 

二.lambda 表达式实现函数式接口
   lambda表达式可以实现函数式接口,本节将讲解函数式接口概念以及用 lambda 表达式实现不同类型的函数式接口。

1.函数式接口
        函数式接口指的是仅包含一个抽象方法的接口,接口中的方法简单明了地说明了接口的用途。

自定义函数式接口

interface Mylnterface {
void method();}

2.lambda 表达式实现无参抽象方法
很多函数式接口的抽放方法是无参数的,如线程接口Runnable接口只有一个run()方法,这样的无参抽象方法在lambda表达式中使用“()”表示。

interface SayHi{
String say();
}
public class No {
public static void main(String[] args) {
SayHi shl = new SayHi (){
public string say() {
return "这是匿名内部类";
}
};
System.out.printIn(sh1.say());
SayHi sh2 = () -> {
return "这是lambda表达式";
};
System.out.println(sh2.say());
}
}

第十四章——lambda表达式与流处理_第2张图片

3.lambda表达式实现有参抽象方法

[例14.2]使用lambda表达式做加法计算

interface AddInt{
int add(int a, int b);
}
public class N{
public static void main(string[] args) {
AddInt ail= new AddInt () {
public intadd(int a, int b) {
return a+b;
}
}
System.out.printIn("匿名内部类:"+ail.add(3,5));
AddInt ai2=(a,b) ->{
 return a+b;
};
System.out.println("lambda表达式:"+ai2 .add(3,5));
}
}

 第十四章——lambda表达式与流处理_第3张图片

4.lambda表达式使用代码块

[例14.3]使用lambda表达式为考试成绩分类

interface CheckGradef
String check(intgrade);//查询成绩结果
}
public class Grade {
public static void main(stringll args){
//TODO Auto-generated method stub
CheckGrade g = (n) ->{//lanbda表达式实现代码块
if(n >=90&&n<=100) {//如果成绩在90--100
return"成绩为优";//输出优
else if(n>=80&&n<90) {//如果成绩在80--90
"成绩为良";//输出良return
Jelse if(n>=60&&n<80) {
return"成绩为中";
Jelse if(n>=0&&n<60) [
return"成绩为差";
else {//不是
return”成绩无效”;//输出成绩无效
}
};
System.out.printIn(g.check(89)) ;//输出结果
}
}

 

三.lambda 表达式调用外部变量

lambda 表达式除了可以调用定义好的参数,还可以调用表达式以外的变量。

1.lambda表达式无法更改局部变量

[例14.4]使用lambda表达式修改局部变量【代码是错的】

第十四章——lambda表达式与流处理_第4张图片

2.lambda表达式可以更改类成员变量

[例14.5]使用lambda表达式修改类成员变量

 第十四章——lambda表达式与流处理_第5张图片

第十四章——lambda表达式与流处理_第6张图片

四.lambda 表达式与异常处理

用多接口的抽象方法为了保证程序的安全性,会在定义时就抛出异常。

[例14.6]使用lambda表达式实现防沉迷接口

第十四章——lambda表达式与流处理_第7张图片 

 第十四章——lambda表达式与流处理_第8张图片

二.方法的引用

1.引用静态方法

        语法如下:

类名::静态方法名

例14.7]使用lambda表达式引用静态方法

interface SMT{
int method(int a, int b);//抽象方法
}
pub1ic class SD {
static int add(int x,int y) {//静态方法,返回两个参数
return x+y;//返回相加结果
}
public static void main(string[] args){
TODO Auto-generated method stubSMIsm=SD: : add;//引用SD类的静态方法
intresult = sm.method (15, 16);//直接调用接口方法获取结果
System.out.println("接口方法结果:"+result);//输出
}
}

第十四章——lambda表达式与流处理_第9张图片

2.引用成员方法

语法如下:

对象名,成员方法名

 [例14.8]使用 lambda表达式引用成员方法

第十四章——lambda表达式与流处理_第10张图片

3.引用带泛型的方法

泛型是Java 开发经常使用到的功能,“.:”操作符支持引用带泛型的方法。除方法外,“.:”操作也支持引用带泛型的类。

[例14.9]使用 lambda表达式引用带泛型的方法

第十四章——lambda表达式与流处理_第11张图片

第十四章——lambda表达式与流处理_第12张图片

4.引用构造方法

        1.引用无参构造方法

语法:

类名::new

 [例14.10]使用lambda表达式引用无参构造方法

第十四章——lambda表达式与流处理_第13张图片

第十四章——lambda表达式与流处理_第14张图片 

2.引用有参构造方法

引用有参构造方法的语法与引用无参构造方法一样。区别就是函数式接口的抽象方法是有参数的。

[例14.11]使用lambda表达式引用有参数的构造方法

 

interface CI1{//构造方法接口
CD1 action(int a);//调用无参方法
}
public class CD1 {//测试类public CD1() {
System.out.println ("无参构造方法");
}
public CDl(int a){//无参数构造
System.out.println("有参构造方法"+a);
}
public static void main(String[] args) {
//ToDo Auto-generated method stub//引用CD类的构造
CI1 a=CD1::new;//通过无参方法创建对象
CD1 b= a.action(5);
}
}

 第十四章——lambda表达式与流处理_第15张图片

 3.引用数组构造方法

第十四章——lambda表达式与流处理_第16张图片

5.Fuction 接口
在此之前的所有实例中,想要使用 ambda 表达式都需要先创建或调用已有的函数式接口14.2.5 Fuction 接口java.until.function 何己经摄供很多预定义函数式接口,就是没有实现任何功能,仅用来封装lambda达式的对象。

 Function 接口方法

第十四章——lambda表达式与流处理_第17张图片

[例14.13]使用lambda表达式拼接IP地址

import java.util.function.Function;
public class FD{
//创建Function接口对象,参数类型是Integer,返回值类型是string
Functionfunction =(n)->{
stringBuilder str = new stringBuilder();
for(Integer num:n){
str.append (num);
str.append('.');
}
str.deleteCharAt(str.length()-1);
return.str.tostring();
};
publicstatic void main(string[] args)
//TODO Auto-generated method stub
Integer[] ip ={192,168,1,1 ;
ED d = new FD();
System.out.println(d.function.apply(ip));
}
}

 第十四章——lambda表达式与流处理_第18张图片

三.流处理

[例14.14]创建员工类,并按照表 14.2创建初始化数据

 第十四章——lambda表达式与流处理_第19张图片

 

1.Stream接口简介
流处理的接口都定义在 java.uil.stream 包下。BaseStream 接口是最基础的接口,但最常用的BaseStream接口的一个子接口——Stream接口,基本上绝大多数的流处理都是在Stream接口上实现的。

表14.3Stream接口的常用方法
第十四章——lambda表达式与流处理_第20张图片

Collection 接口新增两个可以获取流对象的方法。第一个方法最常用,可以获取集合的顺序流,方法如下:

Stream stream();


第二个方法可以获取集合的并行流,方法如下:

Stream parallelstream();


 因为所有集合类都是 Collection 接口的子类,如 ArrayList 类、HashSet 类等,所以这些类都可以进行流处理。例如:

List list = new ArrayList();
Stream s = list.stream();

 2. Optional类

第十四章——lambda表达式与流处理_第21张图片

[例14.15]使用Optional类创建“空”对象

第十四章——lambda表达式与流处理_第22张图片 第十四章——lambda表达式与流处理_第23张图片

3.Collectors 类

第十四章——lambda表达式与流处理_第24张图片 第十四章——lambda表达式与流处理_第25张图片

4.数据过滤

1.filter()方法

filter0方法是 Stream接口提供的过滤方法。该方法可以将lambda表达式作为参数然后按照lambi表达式的逻辑过滤流中的元素。

[例14.16]输出110中的所有奇数

第十四章——lambda表达式与流处理_第26张图片 

 

2.distinct()方法

[例14.18]去除List 集合中的重复数字

第十四章——lambda表达式与流处理_第27张图片 

3.linit()方法

【例题14.19】找出所有员工列表中的前两位女员工

第十四章——lambda表达式与流处理_第28张图片 

 

4.skip()方法

[例14.20]取出所有男员工,并忽略前两位男员工

第十四章——lambda表达式与流处理_第29张图片 

5.数据映射

数据的映射和过滤概念不同:过滤是在流中找到符合条件的元素,映射是在流中获得具体的数据。

[例14.21]获取开发部所有员工的名单

 第十四章——lambda表达式与流处理_第30张图片

[例14.21]计算销售部一个月的薪资总额 

第十四章——lambda表达式与流处理_第31张图片

 

你可能感兴趣的:(java,算法,jvm)