Java SE(十四)之 Java 8新特性(Lambda,Stream流,方法引用等)
创始人
2024-06-03 11:58:24
0

文章目录

  • Java 8
  • Lambda
    • 1.概述
    • 2.应用场景
    • 3.省略规则
  • Stream流
    • 1. 简介
    • 2. Stream流的创建
    • 3. 常用中间方法
    • 4. 常用终结方法
    • 5. 收集Stream流
  • 方法引用
    • 1.方法引用符 ::
    • 2.引用类方法

Java 8

Java8可以是一个里程碑的版本,提供了很多有用的特性。

Lambda

1.概述

作用:简化匿名内部类的代码写法

首先回顾一下匿名内部类:
(为什么要引入匿名内部类?是因为可以方便创建子类对象,最终目的是为了简化代码编写,具体可以指路:匿名内部类)

// 首先创建一个接口
interface inter{public void eat();
}public class AnonymousDemo
{public static void main(String[] args) {// 直接使用匿名内部类,重写eat方法并调用new inter(){@Overridepublic void eat() {System.out.println("正在调用eat方法");}}.eat();}
}

但是,Lambda看到这里还是觉得不够简便,所以进一步开始简化!

Lambda语法:

( parameter-list ) -> { expression-or-statements }
注:-> 是语法形式,无实际含义

所以上面的可以简化成:

interface inter{public void eat();
}
public class AnonymousDemo {public static void main(String[] args) {// 这里的eat函数没有参数,另外实现语句只有一句,就省略{}inter myInter = () -> System.out.println("正在调用eat方法");myInter.eat(); // 调用eat方法}
}

Lambda表达式本身就是一个接口的实现,Lambda表达式只能简化函数式接口的匿名内部类的写法形式

什么是函数式接口?
首先必须是接口、其次接口中有且仅有一个抽象方法的形式
常会在接口上加上一个@FunctionalInterface注解,标记该接口必须是满足函数式接口

最后用两张图进行Java8 和Java7的对比,参考https://www.zhihu.com/question/20125256/answer/324121308

第一张图,和上面的例子很像,原本java7必须得按照面向对象那套流程;而Java 8的Lambda可以直接将接口的实现赋值给一个变量。
在这里插入图片描述

第二张图,是说明上面那个“变量”可以当作参数传给其他函数(传统的Java 7必须要求定义一个实现类)

在这里插入图片描述

2.应用场景

直接通过几种不同场景来熟悉Lambda

借用线程中的接口来演示一下
(1)无参数,无返回体

() -> System.out.println("零参数 lambda");

(2)一个参数,无返回值

// 实现Function接口
Function add = (x) -> x + 1;
int result = add.apply(5); // result = 6

(3)两个参数,有返回值

public static void findMaxValue(int num1,int num2){Comparator comparatorMax = (o1, o2) ->{log.info("o1:{}",o1);log.info("o2:{}",o2);return (o1

3.省略规则

  • 参数类型可以省略不写(编译器会根据上下文判断)
  • 如果只有一个参数,参数类型可以省略,同时()也可以省略。
  • 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!

Stream流

1. 简介

在这里插入图片描述

作用:用来简化数组和集合的操作

简单说就是 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等

可以先看一个小例子:

要求是:创建一个集合,存储多个字符串元素,把集合中所有以"张"开头的元素存储到一个新的集合,把"张"开头的集合中的长度为3的元素存储到一个新的集合最后遍历

如果按照正常编程,可能得挨个遍历对元素进行判断处理,但是Stream编程就可以一步到位

public class StreamDemo {public static void main(String[] args) {//集合的批量添加ArrayList list1 = new ArrayList<>(List.of("张三丰","张无忌","张翠山","王二麻子","张良"));//Stream流list1.stream().filter(s->s.startsWith("张")).filter(s->s.length() == 3).forEach(s-> System.out.println(s));}
}

Stream流的主要构成(三类方法)

  • 获取Stream流:创建一条流水线,并把数据放到流水线上准备进行操作
  • 中间方法:流水线上的操作,一次操作完毕后,还可以继续进行其他操作
  • 终结方法:一个Stream流只能有一个终结方法,是流水线上最后一个操作

下面将对三个组成进行分别介绍

2. Stream流的创建

Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。

(1)Collection集合获取Stream流的方式

可以使用Collection接口中的默认方法stream()生成流

// 获取当前集合对象的Stream流
default Stream stream()

(2) Map体系集合

把Map转成Set集合,间接的生成流

(3)数组获取Stream流的方式

通过Arrays中的静态方法stream生成流

方法含义
public static Stream stream(T[ ] array)获取当前数组的Stream流
public static Stream of(T… values)获取当前数组/可变数据的stream流
public class StreamDemo {public static void main(String[] args) {//Collection体系的集合可以使用默认方法stream()生成流List list = new ArrayList();Stream listStream = list.stream();//Map体系的集合间接的生成流Map map = new HashMap();Stream keyStream = map.keySet().stream();Stream valueStream = map.values().stream();Stream> entryStream = map.entrySet().stream();//数组可以通过Arrays中的静态方法stream生成流String[] strArray = {"hello","world","java"};Stream strArrayStream = Arrays.stream(strArray);
}

3. 常用中间方法

方法含义
stream filter(Predicate< ? super T> predicate)用于对流中的数据进行过滤
stream limit( long maxsize)获取前几个元素
stream skip(long n)跳过前几个元素
stream distinct( )去除流中重复的元素。依赖(hashCode和equals方法)
static stream concat(Stream a,Stream b)合并a和b两个流为一个流

中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程

在Stream流中无法直接修改集合、数组中的数据

4. 常用终结方法

方法含义
void forEach(Consumer action)对此流的每个元素执行遍历操作
long count()返回此流中的元素数

终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了

5. 收集Stream流

把Stream流操作后的结果数据转回到集合或者数组中去

方法名说明
R collect(Collector collector)把结果收集到集合中

具体收集方法(Collector工具类):

方法名说明
public static Collector toList()把元素收集到List集合中
public static Collector toSet()把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中

方法引用

1.方法引用符 ::

2.引用类方法

相关内容

热门资讯

公司辞旧迎新晚会主持词串词   男:尊敬的各位领导、各位来宾,  女:亲爱的同事们  合:大家下午好!  男:光阴似箭,岁月如梭...
纯中式婚礼主持词 纯中式婚礼主持词(通用5篇)  主持词是主持人在台上表演的灵魂之所在。在现在的社会生活中,越来越多的...
悟空传的经典台词 悟空传的经典台词  1、我曾深爱过,我不在乎结局。  2、我知道天会愤怒,那,你知不知道,天也会颤抖...
最有创意的广告词(经典 最有创意的广告词(经典  01 钱不是问题,问题是没钱。  02 钻石恆久远,一颗就破產。  03 ...
毕业感谢致辞 关于毕业感谢致辞(精选15篇)  无论是在学校还是在社会中,大家都写过致辞吧,致辞的措词造句要考虑与...
年会嘉宾简短致辞 年会嘉宾简短致辞  在日复一日的学习、工作或生活中,大家总少不了要接触或使用致辞吧,致辞具有很强的实...
成长礼主持稿 成长礼主持稿(通用8篇)  在日常生活和工作中,需要使用主持稿的情况越来越多,主持稿是在晚会、联欢会...
电视剧《放羊的星星》经典台词 电视剧《放羊的星星》经典台词  在现实社会中,用到台词的地方越来越多,台词是一种特殊的,也是很难掌握...
抓周仪式主持词 抓周仪式主持词范文  主持词是主持人在台上表演的灵魂之所在。在如今这个中国,主持词是活动、集会等的必...
年终总结大会主持词结束语 年终总结大会主持词结束语  主持词是各种演出活动和集会中主持人串联节目的串联词。时代不断在进步,主持...
纯中式婚礼主持词(2) 让我们共同举起手中的酒杯,共同祝福我们这一对知心爱人,祝福他们在爱的旅途上风雨相承,相濡以沫,真爱一...
幼儿园园庆主持词 幼儿园园庆主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在人们积极参与各种活动...
篮球比赛开幕式主持词 篮球比赛开幕式主持词(通用5篇)  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵...
六一儿童节活动节目的主持词 六一儿童节活动节目的主持词(精选7篇)  主持词是各种演出活动和集会中主持人串联节目的串联词。在当今...
公司员工的感谢词 公司员工的感谢词3篇  我们虽然是公司的一名员工,其实也是公司的主人,需要有将公司当成家的态度,态度...
毕业晚会的主持稿 毕业晚会的主持稿(精选11篇)  在现在社会,我们很多时候都不得不用到主持稿,主持稿是主持人为节目进...
《加油金三顺》经典台词 《加油金三顺》经典台词  1、回忆是没有任何力量的。(三顺)  2、人都知道会死,但不还是活着吗?(...
升学酒会主持词 升学酒会主持词  借鉴诗词和散文诗是主持词的一种写作手法。在如今这个时代,司仪等是很多场合都需要的角...
秋季开学典礼颁奖主持词 秋季开学典礼颁奖主持词  活动对象的不同,主持词的写作风格也会大不一样。在人们积极参与各种活动的今天...
老人寿宴致辞 老人寿宴致辞(精选7篇)  在我们平凡的日常里,许多人都写过致辞吧,致辞具有“礼仪性”或“仪式化”的...