java8 functional_java8学习笔记(一):FunctionalInterface与Stream
引言
最近在工作中用到java8的Stream流式操作很多,因而对相关概念与实操作简单归纳与总结:
函数式接口
函数式接口是java8新加入特性,为配合lambda表达式而生。lambda表达式与匿名表达式异同可参考 时光隧道 。判断一个接口是否为函数式接口特别简单,只需满足一个条件即可:一个接口有且仅有一个函数(接口默认static及default方法除外)! 即使该接口未被@FunctionalInterface注解标记,但仍为一个函数式接口
我们来看一个示例:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello the thread.");
}
});
thread.start();
使用lambda表达式创建方式为:
Thread thread=new Thread(()-> System.out.println("hello"));
thread.start();
从示例可以看出,使用lambda表达式配合函数式接口可以大大精简代码,那么函数式接口有什么用呢?
使用lambda表达式调用该函数,将接口方法的实现封装到具体方法,实际也是实现且创建一个接口对象,将方法作为接口实现。更加抽象,只能看到接口方法内部实现。
那么,我们可将常见的使用方式归纳为:
方法引用通过::将方法隶属和方法自身连接起来,如:ClassName :: methodName
1. 静态方法 (args) -> ClassName.staticMethod(args) 转换成 ClassName::staticMethod
2. 实例方法 (args) -> args.instanceMethod() 转换成 ClassName::instanceMethod
3. 外部的实例方法 (args) -> ext.instanceMethod(args) 转换成 ext::instanceMethod(args)
我们来看一个完整的示例:
@FieldDefaults(level = AccessLevel.PRIVATE)
@ToString
public class Kid {
Integer age;
String name;
public Kid(int age, String name) {
this.age = age;
this.name = name;
}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
public class MethodReference {
public static void main(String[] args) {
List kids = Arrays.asList(
new Kid(10, "奶酪1"),
new Kid(8, "奶酪3"),
new Kid(11, "奶酪2")
);
// 采用lambda表达式排序
kids.sort((Kid a, Kid b) -> compare(a.getAge(), b.getAge()));
kids.forEach(System.out::println);
// 采用方法引用排序
kids.sort(Comparator.comparing(Kid::getName));
kids.forEach(System.out::println);
}
}
输出如下:
Kid(age=8, name=奶酪3),Kid(age=10, name=奶酪1),Kid(age=11, name=奶酪2)
Kid(age=10, name=奶酪1),Kid(age=11, name=奶酪2),Kid(age=8, name=奶酪3)
java8新增的java.util.function包,为我们提供了诸多的函数式接口,归纳如下:
函数式接口名
参数类型
接口说明
Supplier
Supplier< T >
提供T对象(例如工厂),不接收值
Consumer
Consumer< T >
接收T对象,不返回值
Predicate
Predicate< T >
接收T对象并返回boolean
Function
Function< T, R >
接收T对象,返回R对象
UnaryOperator
UnaryOperator< T >
接收T对象,返回T对象
BiConsumer
BiConsumer
接收T对象和U对象,不返回值
BiPredicate
BiPredicate
接收T对象和U对象,返回boolean
BiFunction
BiFunction
接收T对象和U对象,返回R对象
BinaryOperator
BinaryOperator< T >
接收两个T对象,返回T对象
函数式接口须配合Stream才能发挥其最大的用处,接下来我们对Steam接口方法常见使用方式进行举例。
Stream浅析
何为Stream ?
流(Stream)是Java API的新成员,它允许以声明性的方式处理数据集合(类似于数据库查询语句).暂且理解为遍历数据集的高级迭代器。
我们可以用一图来归纳Stream的通用场景:
java8 functional_java8学习笔记(一):FunctionalInterface与Stream相关推荐
- java8新特性学习笔记(Lambda,stream(),filter(),collect(),map())
文章目录 1.lambda表达式(重点) 1.需求分析 2.Lambda表达式初体验 3.Lambda的语法规则 3.1 Lambda练习1 3.1 Lambda练习2 4.Lambda表达式的原理 ...
- Java学习笔记---Lambda表达式及Stream流Api
Lambda 特性: 允许把函数作为参数传递进方法. 前置条件: 必须是函数式接口---------->[函数式接口:满足以下三条1.接口中只有一个抽象方法.2.可以有默认实现的方法.3.可以有 ...
- Java8实战学习笔记(三)——函数式数据处理
一.引入流 (一).引言 1.流是什么 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).可以看成遍历数据集的高级迭代器. 流可以透明地并行 ...
- Java8实战学习笔记(四)——高效 Java 8 编程(一)
一.重构.测试和调试 (一).为改善可读性和灵活性重构代码 用更紧凑的方式描述程序的行为 -- Lambda表达式 将一个既有的方法作为参数传递给另一个方法 -- 方法引用 如何运用前几章介绍的Lam ...
- JAVA8的学习笔记之Collection
2019独角兽企业重金招聘Python工程师标准>>> 作为一个java粉的新手,对java的各个常用的库需要深入了解,做到雨露均沾.此博客就谈一谈Collection,包括其子类L ...
- CUDA 学习笔记 —— (九)Stream详解
文章目录 概念 异步并发执行 overlap data Streams 为何使用stream default stream 串行,单流,多流性能对比 默认stream串行执行 使用一个stream异步 ...
- 尚硅谷周阳老师 SpringCloud第二季学习笔记
前言:首先感谢尚硅谷周阳老师的讲解,让我对springcloud有了很好的理解,周阳老师的讲课风格真的很喜欢,内容充实也很幽默,随口一说就是一个段子,我也算是周阳老师的忠实粉丝啦. 先说说课程总体内容 ...
- springcloud 链路追踪_Spring Cloud学习笔记
spring cloud提供了一套完整的微服务架构,主要包括服务发现与治理,负载均衡,服务容错,服务调用框架,网关,配置中心,消息总线及消息驱动框架,健康检查与服务跟踪等模块. 下面这个系列,我将对每 ...
- java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用
本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...
最新文章
- python【蓝桥杯vip练习题库】—BASIC-12十六进制转八进制
- Matlab中newff函数使用方法和搭建BP神经网络的方法
- 网易云信合作伙伴招募计划全面开启!
- django mysql内存泄漏_Django的:使内存的关系,而不保存到数据库
- 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构
- ICLR2020满分论文 | 为什么梯度裁剪能加速模型训练?
- 一周以来的工作总结--oracle分区的迁移
- FTP下载文件中文名乱码FTP访问
- 数学基础加强2---概率论与贝叶斯先验
- JUCE框架教程(2)—— 创建一个基本的音频/MIDI 插件第一部分:设置
- 移动通讯技术--3G
- 用Visio画软件(模块)功能图
- cst时间(utc和cst时间)
- 用java实现猜数字游戏程序:基础、偏移、三次机会、是否继续玩
- QT 插入视频并实现循环播放
- 前端UI框架横向对比
- tensorflow和cuda以及cudnn版本对齐
- 写文案,认准这几个APP就够了
- 弘辽科技:淘宝开店后怎么建群?手机端怎么建群?
- 制作类似于淘宝点击简单的轮播图
热门文章
- python入门(@property,@*.setter)
- 使用python+keras来识别狗的品种
- 琥珀ai_Java 10:Java开发人员想要什么? 项目琥珀和瓦尔哈拉! 他们什么时候想要他们? 当他们准备好了!
- mongodb java连接数_Java监控MongoDB空间使用量、连接数
- 贪吃蛇c加加代码_C语言实现的贪吃蛇小游戏
- BP神经网络+c代码
- 全球最高角分辨率商用4D成像雷达发布,傲酷“软”手解决世界“硬”难题
- OpenCV系列之Meanshift和Camshift | 四十七
- OpenCV系列之轮廓分层 | 二十五
- 【STM32使用内部RC振荡器】1、时钟源的设置