引言

最近在工作中用到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相关推荐

  1. java8新特性学习笔记(Lambda,stream(),filter(),collect(),map())

    文章目录 1.lambda表达式(重点) 1.需求分析 2.Lambda表达式初体验 3.Lambda的语法规则 3.1 Lambda练习1 3.1 Lambda练习2 4.Lambda表达式的原理 ...

  2. Java学习笔记---Lambda表达式及Stream流Api

    Lambda 特性: 允许把函数作为参数传递进方法. 前置条件: 必须是函数式接口---------->[函数式接口:满足以下三条1.接口中只有一个抽象方法.2.可以有默认实现的方法.3.可以有 ...

  3. Java8实战学习笔记(三)——函数式数据处理

    一.引入流 (一).引言 1.流是什么 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).可以看成遍历数据集的高级迭代器. 流可以透明地并行 ...

  4. Java8实战学习笔记(四)——高效 Java 8 编程(一)

    一.重构.测试和调试 (一).为改善可读性和灵活性重构代码 用更紧凑的方式描述程序的行为 -- Lambda表达式 将一个既有的方法作为参数传递给另一个方法 -- 方法引用 如何运用前几章介绍的Lam ...

  5. JAVA8的学习笔记之Collection

    2019独角兽企业重金招聘Python工程师标准>>> 作为一个java粉的新手,对java的各个常用的库需要深入了解,做到雨露均沾.此博客就谈一谈Collection,包括其子类L ...

  6. CUDA 学习笔记 —— (九)Stream详解

    文章目录 概念 异步并发执行 overlap data Streams 为何使用stream default stream 串行,单流,多流性能对比 默认stream串行执行 使用一个stream异步 ...

  7. 尚硅谷周阳老师 SpringCloud第二季学习笔记

    前言:首先感谢尚硅谷周阳老师的讲解,让我对springcloud有了很好的理解,周阳老师的讲课风格真的很喜欢,内容充实也很幽默,随口一说就是一个段子,我也算是周阳老师的忠实粉丝啦. 先说说课程总体内容 ...

  8. springcloud 链路追踪_Spring Cloud学习笔记

    spring cloud提供了一套完整的微服务架构,主要包括服务发现与治理,负载均衡,服务容错,服务调用框架,网关,配置中心,消息总线及消息驱动框架,健康检查与服务跟踪等模块. 下面这个系列,我将对每 ...

  9. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用

    本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...

最新文章

  1. python【蓝桥杯vip练习题库】—BASIC-12十六进制转八进制
  2. Matlab中newff函数使用方法和搭建BP神经网络的方法
  3. 网易云信合作伙伴招募计划全面开启!
  4. django mysql内存泄漏_Django的:使内存的关系,而不保存到数据库
  5. 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构
  6. ICLR2020满分论文 | 为什么梯度裁剪能加速模型训练?
  7. 一周以来的工作总结--oracle分区的迁移
  8. FTP下载文件中文名乱码FTP访问
  9. 数学基础加强2---概率论与贝叶斯先验
  10. JUCE框架教程(2)—— 创建一个基本的音频/MIDI 插件第一部分:设置
  11. 移动通讯技术--3G
  12. 用Visio画软件(模块)功能图
  13. cst时间(utc和cst时间)
  14. 用java实现猜数字游戏程序:基础、偏移、三次机会、是否继续玩
  15. QT 插入视频并实现循环播放
  16. 前端UI框架横向对比
  17. tensorflow和cuda以及cudnn版本对齐
  18. 写文案,认准这几个APP就够了
  19. 弘辽科技:淘宝开店后怎么建群?手机端怎么建群?
  20. 制作类似于淘宝点击简单的轮播图

热门文章

  1. python入门(@property,@*.setter)
  2. 使用python+keras来识别狗的品种
  3. 琥珀ai_Java 10:Java开发人员想要什么? 项目琥珀和瓦尔哈拉! 他们什么时候想要他们? 当他们准备好了!
  4. mongodb java连接数_Java监控MongoDB空间使用量、连接数
  5. 贪吃蛇c加加代码_C语言实现的贪吃蛇小游戏
  6. BP神经网络+c代码
  7. 全球最高角分辨率商用4D成像雷达发布,傲酷“软”手解决世界“硬”难题
  8. OpenCV系列之Meanshift和Camshift | 四十七
  9. OpenCV系列之轮廓分层 | 二十五
  10. 【STM32使用内部RC振荡器】1、时钟源的设置