0

0

Java8新特性的lambda,函数式接口,StreamingAPI

(*-*)浩

(*-*)浩

发布时间:2019-10-23 16:12:15

|

2820人浏览过

|

来源于CSDN

转载

Java8新特性的lambda,函数式接口,StreamingAPI

Lambda表达式

1.是对匿名内部类对象的一种格式的简化

2.Java8中引入了一个新的运算符"->",称为箭头运算符,或者lambda运算符

3.作用就是分割前后两部分的

立即学习Java免费学习笔记(深入)”;

4.左边:表示的是Lambda表达式的参数列表(接口中,定义的抽象方法的参数)

5.右边:表示的是方法的方法体,Lambda体

语法格式的书写

1.没有参数,也没有返回值

左面的小括号不能省,右边的大括号可以省略也可以不用省

java-13.png

2.有一个参数,没有返回值

有多个参数,没有返回值

左边的括号 可省可不省,右边的大括号可以省也可以不用省

java-14.png

3.接口中需要重写的方法内容有很多,需要给多句话的加上大括号

java-15.png

注意事项:如果Lambda体中的语句有只有一句,那么大括号可以省略不写;如果大扩号中只有一条语句,并并且是return语句,那么return关键字可以省略不写

函数式接口

Lambda表达式使用的前提,就是接口必须是函数式接口,如果在接口中,只有一个抽象方法,那么这个接口就是函数式接口,常用一个注解来检查当前接口是否是一个函数式接口@FunctionalInterface,如果不是函数式接口,则编译报错

作用:

想表达的是一个方法的内容,由于方法不在任何类中,所有被称为函数,接口其实想表达的就一个函数的声明,接下来的使用这个接口的实现类对象,来表达一个函数的体现

消费型接口:

抽象方法:void accept(T t)

当某个函数可以接受一个数据,并且处理这个数据,处理完成之后,就不需要返回任何数据,这个函数需要当做数据来进行传递,就使用消费型接口

package cn.ujiuye.function;
import java.util.function.Consumer;
import cn.ujiuye.domin.Mobile;
/**
 * @author liugang
 * 消费型接口方式
 */
public class CustmoerTest {
     public static void main(String[] args) {
	    Mobile m = new Mobile("华为",3000);
	     //lambad表达式实现赋值  内部显然是对消费者接口的使用,故是对函数式接口编程的新东西
	     updateMobile(m, x -> x.setPrice(x.getPrice() + 1000 ));
	     System.out.println(m);
	 }
    //调用其使用的方法
	private static void updateMobile(Mobile m, Consumer con) {
	     for (int i = 0; i < 3; i++) {
		     con.accept(m);	
		 }
	}
}

方法引用

MedPeer科研绘图
MedPeer科研绘图

生物医学领域的专业绘图解决方案,告别复杂绘图,专注科研创新

下载

1.写一个函数式接口时,方法的实现,已经被某个其他的对象实现了,就不需要在Lambda中了,再次调用这个实现,而可以那个直接定义好的方法了

2.格式

函数式接口: 名称 = 对象名 :: 方法名称

函数式接口: 名称 = 类名::静态方法名

3.作用

把已经实现的当做一个数据,作为一个引用,赋值给某个函数式接口的引用,可以把这个引用当做方法的返回值,也可以作为一个实现类对象

java-16.png

StreamingAPI

在jdk1.8中,提供了一个stream类型,可以很方便的操作容器中的数据,不需要手动定义循环就可以完成对数据的过滤,输出及其其他的操作

Stream的类型的获取和常用方法

Collection的获取:

调用stream()方法,调回Stream对象

终止方法:foreach count

延迟方法:filter limit skip 等

package cn.ujiuye.stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
/**
 * @author liugang
 *
 */
public class StreamApiDemo03Demo03 {
    public static void main(String[] args) {
    	//定义一个集合,并获取stream类型的数据
		List list = new ArrayList();
		Collections.addAll(list, 12,32,-13,50,100);
		Stream stream = list.stream();
		stream.forEach(x ->System.out.println(x - 100));
		System.out.println(list.stream().count());
    }
}

package cn.ujiuye.stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;
/**
 * @author liugang
 * Stream中一些方法的使用
 */
public class StreamApiDemo04 {
   public static void main(String[] args) {
	   ArrayList list = new ArrayList<>();
	   Collections.addAll(list, -4,-12,-199,0,15,25,36,100);
	   Stream stream = list.stream();
	   stream.filter(x -> x > 0)    //过滤
	         .skip(1)               //跳过
	         .limit(2)              //限制
	         .sorted((x,y) -> -1)   //排序
	         .forEach(System.out::println);
   }
}

练习

有两个Arraylist集合,存储队伍中的多个成员姓名,使用Stream方式,对以下步骤进行操作

1、第一个队伍只要名字为3个字的成员姓名

2、第一个队伍只要筛选之后的前三个人

3、第二个队伍只要姓张的

4、第二个队伍筛选之后不要前两个人

5、将两个队伍合并成一个队伍

6、合并之后的队伍中的所有人的Person(自定义类型)对象,存储到一个ArrayList集合中

队伍1:宫本武藏、宋公明、苏有朋、石头人、时传祥、李耳、庄子、洪七公

队伍2:帕瓦罗蒂、张三疯、赵薇薇、张自忠、孛儿只斤铁木真、张天爱、张翠花

public class StreamApiTest {
    @SuppressWarnings("unused")
	public static void main(String[] args) {
	    //创建集合
    	List list1 = new ArrayList();
	    List list2 = new ArrayList();
	    //把元素添加到集合中
	    Collections.addAll(list1, "宫本武藏","宋公明","苏有朋","石头人","时传祥","李耳","庄子","洪七公");
	    Collections.addAll(list2, "帕瓦罗蒂","张三疯","赵薇薇","张自忠","孛儿只斤铁木真","张天爱","张翠花");
	    //创建Stream对象
	    Stream stream1 = list1.stream();
	    Stream stream2 = list2.stream();
	    //创建筛选后的元素
	    Stream limit1 = stream1.filter(x -> x.length() == 3).limit(3);
	    Stream limit2 = stream2.filter(x -> x.startsWith("张")).skip(2);
	    //将两对的人合到同一个对里
	    Stream concat = Stream.concat(limit1, limit2);
	    //定义一个集合用来存对象
	    List list = new ArrayList();
	    //想要的是一个Person对象的流
	    //Stream map = concat.map(x -> new Person(x);
	    Stream map = concat.map(Person::new);
	    //将流对象添加到集合中
	    map.forEach(list::add);
	    System.out.println(list);
	}
}

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极客学院Java8新特性视频教程
极客学院Java8新特性视频教程

共17课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号