目录

1 Stream基本概念

1.1 什么是Stream

1.2 Stream的特点

2 Stream API初体验

2.1 构造数据

2.1 使用for循环实现

2.2 使用Lambda表达式结合Stream API实现

3 创建Stream对象

3.1 根据数组创建Stream对象

3.2 根据多个值创建Stream对象

3.3 根据List或Set创建Stream对象

3.4 根据Map创建Stream对象

4 根据Stream对象得到指定类型数据

4.1 Stream对象转数组

4.2 Stream对象中的元素拼接起来成字符串

4.3 Stream对象转List

4.4 Stream对象转Set

5 中间操作

5.1 过滤

5.2 skip

5.3 limit

5.4 distinct

5.5 min

5.6 max


1 Stream基本概念

1.1 什么是Stream

Stream与Lambda表达式同为Java8的新特性,是一个来自数据源的元素队列并支持聚合操作,通过对Stream的操作可以以类似写SQL的方式对Java集合进行包括筛选、排序、聚合等运算。

1.2 Stream的特点

(1)Stream不存储数据;

(2)Stream不会改变源数据;

(3)Stream经过运算后会根据运算的结果返回新的集合对象。

2 Stream API初体验

2.1 构造数据

在这里构造一个Integer类的集合,并添加元素,下面会分别以for循环与Stream API的方式找出其中大于10的元素并返回新的集合。

List<Integer> numList = new ArrayList<>();
Collections.addAll(numList, 1, 2, 3, 4, 5, 6, 10, 12, 14, 16, 18, 20, 100);

2.1 使用for循环实现

使用for循环可以采用将符合条件的元素写入新集合或者从原集合中删除不符合条件的元素,这里采用了前者。

    private List<Integer> funByForeach(List<Integer> numList) {List<Integer> returnList = new ArrayList<>();for(Integer num : numList) {if(num > 10) {returnList.add(num);}}return returnList;}

2.2 使用Lambda表达式结合Stream API实现

使用Lambda表达式结合Stream API可以将代码精简至一行。

private List<Integer> funByStream(List<Integer> numList) {return numList.stream().filter(num -> num > 10).collect(Collectors.toList());
}

3 创建Stream对象

3.1 根据数组创建Stream对象

String[] strArray = {"曹孟德", "刘备", "关羽", "张飞"};
Stream<String> stream = Arrays.stream(strArray);

3.2 根据多个值创建Stream对象

这个API在源码中实际上是调用了Arrays.stream方法。

Stream<String> stream = Stream.of("曹孟德", "刘备", "关羽", "张飞");

3.3 根据List或Set创建Stream对象

根据List与Set都是Collection的子类,调用了同样的API去创建Stream对象。

List<String> strList = new ArrayList<>();
Collections.addAll(strList, "曹孟德", "刘备", "关羽", "张飞");
Stream<String> stream = strList.stream();
Set<String> strSet = new HashSet<>();
Collections.addAll(strSet, "曹孟德", "刘备", "关羽", "张飞");
Stream<String> stream = strSet.stream();

3.4 根据Map创建Stream对象

Map<String, String> map = new HashMap<>();
map.put("曹孟德", "Cao Meng De");
map.put("刘备", "Liu Bei");
map.put("关羽", "Guan Yu");
map.put("张飞", "Zhang Fei");
Stream<Map.Entry<String, String>> stream = map.entrySet().stream();

4 根据Stream对象得到指定类型数据

Stream API所做的往往是将集合转为Stream,在Stream对象中对数据进行运算,根据运算后的Stream得到结果,所以在数据转为流后,会根据流对象再转为原来的数据类型对象。

4.1 Stream对象转数组

String[] strArray = {"曹孟德", "刘备", "关羽", "张飞"};
// 根据数组创建Stream
Stream<String> stream = Arrays.stream(strArray);
// 根据流得到数组
String[] resultArray = stream.toArray(String[]::new);

4.2 Stream对象中的元素拼接起来成字符串

// 创建流
Stream<String> stream = Stream.of("曹孟德", "刘备", "关羽", "张飞");
// 根据流得到拼接后的字符串
String resultStr = stream.collect(Collectors.joining());

4.3 Stream对象转List

List<String> strList = new ArrayList<>();
Collections.addAll(strList, "曹孟德", "刘备", "关羽", "张飞");
// 根据List创建Stream
Stream<String> stream = strList.stream();
// 根据Stream得到List
List<String> resultList = stream.collect(Collectors.toList());

4.4 Stream对象转Set

Set<String> strSet = new HashSet<>();
Collections.addAll(strSet, "曹孟德", "刘备", "关羽", "张飞");
// 根据Set创建Stream
Stream<String> stream = strSet.stream();
// 根据Stream得到Set
Set<String> resultSet = stream.collect(Collectors.toSet());

5 中间操作

在将集合或数组转换成流,再从流转为其他类型对象的过程中可以有中间操作,大多数时候我们使用流就是为了使用中间操作,这些中间操作可以对集合中的元素进行过滤、聚合等运算。

这里我们用List集合构造数据对中间操作进行测试,代码如下。

List<Integer> numList = new ArrayList<>();
Collections.addAll(numList,100, 50, 70, 150, 90, 1000, 99, 10);

5.1 过滤

上面构造的numList集合是一个Integer集合,下面的代码是过滤掉所有数值小于或等于100的元素,也就是留下数值大于100的元素。

numList = numList.stream().filter(num -> num > 100).collect(Collectors.toList());

5.2 skip

skip方法的参数是一个long类型,输入的参数值表示跳过的元素个数,比如集合长度为8,使用skip(2),会保留后面6个元素,而从流中删除前两个元素,并且这一操作是有状态的。如下代码所示。

// 此时集合中的元素为[70, 150, 90, 1000, 99, 10]
numList = numList.stream().skip(2).collect(Collectors.toList());

5.3 limit

这里的limit可以限制元素的数量,如果配合skip使用就类似sql语句中limit的用法了。如下代码所示。

// 此时集合中的元素为[70, 150, 90]
numList = numList.stream().skip(2).limit(3).collect(Collectors.toList());

5.4 distinct

是一个无参方法,与sql中distinct关键字的作用类似。

5.5 min

取集合中的最小值,用法如下。

// 这里minNum的值是10
Optional<Integer> optional = numList.stream().min((x, y) -> x - y);
Integer minNum = -1;
if(optional.isPresent()) {minNum = optional.get();
}

5.6 max

取集合中的最大值,与min的用法类似。

// 这里minNum的值是1000
Optional<Integer> optional = numList.stream().max((x, y) -> x - y);
Integer minNum = -1;
if(optional.isPresent()) {minNum = optional.get();
}

Java8 Lambda表达式(三)Lambda表达式与Stream API相关推荐

  1. java8 Lambda表达式的应用(函数式接口、lambda表达式,方法引用及Stream API)

    之前写了一篇博客简单介绍了一下java 8发布新增的一些特性功能,java 8在2014年发布,距今也不少年了,但是lambda表达式使用并不熟练,现在一边学习,一边记录一下. 目录 一.Lambda ...

  2. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  3. java8新特性-lambda表达式和stream API的简单使用

    一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  4. 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类

    1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...

  5. java:java8新特性(Lambda 表达式、方法引用、构造器引用、数组引用、Stream API)

    速度更快 对 HashMap .ConcurrentHashMap低层的数据结构(数组+链表+二叉树) 低层的内存结构(将永久区更新为元空间,元空间使用的是物理内存) 代码更少(增加了新的语法 Lam ...

  6. 【Java】Java8新特性Lambda表达式和Stream API

    Lambda表达式是实现支持函数式编程技术的基础. 函数式编程与面向对象编程:函数式编程将程序代码看作数学中的函数,函数本身作为另一个函数参数或返回值,即高阶函数.而面向对象编程按照真实世界客观事物的 ...

  7. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  8. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

  9. Java8函数式接口与Lambda表达式

    摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...

最新文章

  1. 原生js的attachEvent和addEventListener解决window.onload在一个页面只能执行一次的问题
  2. Java NIO 系列教程
  3. 什么数据库比mysql效率高_牛x!一款比传统数据库快 100-1000 倍的数据库,来认识一下?...
  4. Android 自定义组件随着手指自动画圆
  5. Hibernate中使用Criteria查询及注解——(DeptTest.java)
  6. 错误An entity with the same identity already exists in this EntitySet RIA
  7. vue插入富文本编辑器(支持视频和图片的上传)
  8. Installing Perl modules from CPAN
  9. 《Java程序设计精编教程(第3版)》之课后习题 - 个人作
  10. Thinkpad部分软件相关服务进程的总结
  11. 技嘉B550M-AORUS-ELITE主板RAID故障与解决方案
  12. 转-国内移动广告平台的现状对比(2010年8月-10月)
  13. 谢烟客---------Linux之网络基础知识
  14. 华为harmonyos手机开发者,华为鸿蒙HarmonyOS2.0手机开发者Beta版正式发布
  15. 【每日蓝桥】7、一三年省赛Java组真题“核桃的数量”
  16. VUE--Form表单
  17. java中考勤管理_JAVA人事员工考勤管理(含论文)源码
  18. Cesium创建任意位置和形状的水纹波浪效果
  19. 加班多?交友范围窄?单身互联网人点进来!
  20. Android开发实用小工具三——面积转换工具

热门文章

  1. 股票自动化交易软件的优势
  2. 【1】GAN在医学图像上的生成,今如何?
  3. 2022-08-15
  4. 2022出海拉美:秘鲁电商市场现状及发展前景
  5. [PKUSC2022]撸猫——Hall定理
  6. Python热点舆情数据挖掘
  7. 02_C++实现多线程服务器代码(linux系统)
  8. 【初澈er】泰拉瑞亚/加模组/加插件/Linux服务器搭建教程 Terraria / tModloader /TShock MOD 手机电脑联机 云服务器 简单
  9. HTML+CSS大作业:餐饮美食网页设计与实现——下午茶甜点美食带psd(6页)
  10. 「CSS」文本编排相关的CSS属性设置