目录

前言:综合了一下常用Stream流与Optional操作,底部有本人常用的Stream流判空写法,用以记录和复习

Stream流:

获取流

1. list获取:

List<String> list= new ArrayList();
Stream<String> stream=list.stream();
  1. set
Set<String> set=new HashSet<>()
Stream<String> stream=set.stream();
  1. vector
  Vector<String> vector = new Vector<>();
Stream<String> stream = vector.stream();

2. Map获取

需要分key、value或entry等情况

   Map<String, String> map = new HashMap<>();
//key
Stream<String> keyStream = map.keySet().steam();
//value
Stream<String> valueStream = map.values().stream();
//entry
Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();

3. 数组获取

数组不能添加默认方法,Stream中提供静态方法of

    String[] array = {"张三","李四","王五","赵六" };
Stream<String> stream = Stream.of(array); //或使用Arrays的静态方法
Arrays.stream(array)
}

流方法分类:

  1. 延迟方法
  • 支持链式调用,

  • 返回值类型仍然是 Stream 接口自身类型的方法

  1. 终结方法
  • 不支持类似 StringBuilder 那样的链式调用,

  • 返回值类型不再是 Stream 接口自身类型的方法

1. forEach(终结方法)

list.stream.foreach(h->{System.out.println(s)});

2. count计数(终结方法)

返回值为long

list.stream().count();

3.filter过滤

将一个流转换成另一个子集流

//删选stream中名字首字为方的
list.stream().filter(user->{user.startWith("方")});

4.limit截取

参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作

list.stream().limit(3);

5.skip跳过

流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流

list.stream.skip(2);

6.map映射

可转换不同流类型(可自动装箱)

Stream<String> original = Stream.of("1", "2", "3");
Stream<Integer> result = original.map(s->Integer.parseInt(s));

7.concat组合

将两个流合并为一个流

注:此为静态方法,与java.lang.String中的concat有区别

Stream.concat(streamA, streamB);

8.distinct去重

distinct不光通过值,还比较地址进行去重

list.stream().distinct();

9.faltMap扁平化流

CSDN大佬解释通俗易懂:

Java8 FlatMap的使用_杨幂等的博客-CSDN博客_jdk8 flatmap

//(map)流中有流,需要两次遍历
Stream<Stream<Character>> streamStream = list.stream().map(StreamDemo::fromStringToStream);
streamStream.forEach(s -> {
s.forEach(System.out::println);
});
//(flatMap)流里还有流,使用flatMap可以直接把里面的流打开,一次遍历就可以了
Stream<Character> characterStream = list.stream().flatMap(StreamDemo::fromStringToStream);
characterStream.forEach(System.out::println);

10. sort排序

  • 默认为自然排序 :
list.stream.sorted()
  • 定制排序

需要传入Comparator接口(如果流中的是引用类型,只能用定制排序)

//常规:
integerList.stream()
.sorted((e1,e2) -> e2->e1)
.forEach(System.out::println); //集合中根据对象属性排序
List<User> list=new ArrayList<>();
list.stream()
.sorted(Comparator.comparing(User::getAge))
.collect(Collectors.toList());

11.match 检测匹配(终结方法)

返回为Boolean值

//1.allMatch 全部匹配--判断列表中是否全大于5
list.stream().allMatch(i -> i > 5) //2.anyMatch 至少匹配 --判断列表值是否至少有一个大于5
list.stream().anyMatch(i -> i > 5) //3.noneMatch 没有匹配 --判断列表值是否全部不大于5
list.stream().noneMatch(i -> i > 5)

12.查找

  1. findFirst 查找第一个元素,返回Optional

  2. findAny 查找任意元素 返回Optional

list.stream.findFirst();
list.stream.findAny();
  1. max 查找最大最小值(终结方法) 返回Optional
  //  查找最大的数
list.stream().max((e1, e2) -> e1 - e2);

13. reduce 缩减(终结方法)

实现 求和,求积,求最大值

//求和
list.stream().reduce((x, y) -> x + y)
list.stream().reduce(0,Integer::sum) //求积
list.stream().reduce((x,y)->x*y) //求最大值
list.stream().reduce((x, y) -> x > y ? x : y)
list.stream().reduce(1, Integer::max)

14.collect 收集(终结方法)

流转换

//toList 返回偶数集合
list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList() //toSet返回Set集合
list.stream().collect(Collectors.toSet()) //toMap返回Map ---user中有name,age
List<User> userList= new ArrayList<User>();
list.stream().collection(Collectiors.toMap(User::getName,user->user)

15 迭代 Stream.iterate

使用Stream.iterate创建流,即无限流

//生成一个0-4的自增数,并打印输出
Stream.iterate(0, n -> n + 1)
.limit(5)
.forEach(x -> System.out.println(x));

使用流注意点:

程序猿大佬链接:java成神之——Stream和Optional

1. 如果一个流没有调用终端方法,那么流的其他操作都不会执行。

2. 流用来操作文件的时候才需要手动关闭,单独使用Stream不需要关闭

try (Stream<String> lines = Files.lines(Paths.get("C:\Users\stream.txt")).onClose(() -> System.out.println("流自动关闭"))) {
lines.forEach(System.out::println);
}

3. 平行流:.parallelStream()

list.parallelStream().forEach(System.out::println);

注:如果对元素的顺序不要求的时候可以使用平行流,开启多核心多线程加速处理速度,使用平行流会显著降低性能

4. 流本身是不能重用的,但是可以使用iterator来实现重用

5. 分组计数:

Stream
.of("a", "b", "a", "c")
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.forEach(System.out::println); a=2
b=1
c=1

Optional操作

CSDN大佬博客:

JDK1.8新特性值Optional_木叶之荣的博客-CSDN博客_jdk1.8 optional

通常用以解决空指针异常:

方法 使用描述
of 把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException
empty 创建一个空的Optional对象
ofNullable 把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象
get 如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
orElse 如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
orElseGet 如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值
orElseThrow 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常
filter 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
map 如果创建的Optional中的值存在,对该值执行提供的Function函数调用
flagMap 如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
isPresent 如果创建的Optional中的值存在,返回true,否则返回false
ifPresent 如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做

常用方式:

方式一(不建议使用Optional进行集合判空,集合判空使用CollectionUtil)

List<String> list=new ArrayList<>();
//正确方式
if (CollectionUtil.isNotEmpty(list)) {
list.stream().forEach(h ->
System.out::println
);
System.out.println(list)
}
//(不推荐)出现问题:
//在new List时,Optional在判断list的size=0进行sql操作时可能会出现问题
Optional.ofNullable(list).ifPresent(list -> {
list.stream().forEach(进行sql 操作);
});

方式二

//返回一个新的空对象
Optional.ofNullable(userList).orElseGet(() -> {
return new ArrayList<>();
})
.stream()
.filter(a -> a != null)
.forEach(System.out::println);
} //过滤list中值为空的数,同样使用list不推荐,
//最好使用CollectionUtils进行集合判空后使用
Optional.ofNullable(list).ifPresent(ll -> {
ll.stream()
.filter(a -> a != null)
.forEach(h ->System.out::println);
});

java8 Steam流及Optional的使用的更多相关文章

  1. 功能:Java8新特性steam流

    Java8新特性steam流 一.包装数据类型 @Test public void main22() { List<Integer> list = new ArrayList<Int ...

  2. 【java多线程】java8的流操作api和fork/join框架

    原文:https://blog.csdn.net/u011001723/article/details/52794455/ 一.测试一个案例,说明java8的流操作是并行操作 1.代码 package ...

  3. java8新特性之Optional类

    NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...

  4. 五分钟学习Java8的流编程

    1.概述 Java8中在Collection中增加了一个stream()方法,该方法返回一个Stream类型.我们就是用该Stream来进行流编程的: 流与集合不同,流是只有在按需计算的,而集合是已经 ...

  5. 乐字节Java8核心特性之Optional类

    大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...

  6. JDK8 Steam流操作

    原文:https://github.com/niumoo/jdk-feature/blob/master/src/main/java/net/codingme/feature/jdk8/Jdk8Str ...

  7. 【转】Java8 Stream 流详解

      当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似.但是 ...

  8. 近万字总结:Java8 Stream流式处理指南

    总结/朱季谦 在实际项目当中,若能熟练使用Java8 的Stream流特性进行开发,就比较容易写出简洁优雅的代码.目前市面上很多开源框架,如Mybatis- Plus.kafka Streams以及F ...

  9. 让代码变得优雅简洁的神器:Java8 Stream流式编程

    原创/朱季谦 本文主要基于实际项目常用的Stream Api流式处理总结. 因笔者主要从事风控反欺诈相关工作,故而此文使用比较熟悉的三要素之一的[手机号]黑名单作代码案例说明. 我在项目当中,很早就开 ...

  10. 乐字节-Java8新特性之Optional

    上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一 ...

随机推荐

  1. 10个PPT制作实用小技巧

    当制作PPT时,您可以使用一些实用的小技巧来提升演示效果和工作效率.以下是10个PPT制作实用小技巧的详细描述: 第一.选择合适的模板 选择合适的PPT模板非常重要,因为模板可以决定整个演示的风格和视 ...

  2. SpringBoot项目中常见组件的配置属性

    本文本的属性摘录自官方Properties配置清单,并附加了国内开发常用的框架配置属性.以国内WEB开发中,所涉及的常见组件为顺序组织配置清单 1. 配置属性清单 1.1 日志配置 序号 属性名 类型 ...

  3. 虚拟机运行Hadoop | 各种问题解决的心路历程

    ps:完成大数据技术实验报告的过程,出项各种稀奇古怪的问题.(知道这叫什么吗?经济基础决定上层建筑,我当时配置可能留下了一堆隐患,总之如果有同样的问题,希望可以帮到你) 一.虚拟机网络连接不通的各种情 ...

  4. UI自动化测试框架:数据驱动

    一.UI自动化框架介绍 测试框架使用了Po设计模式(Page Object),每一个页面用一个类来对应,这个类里面要实现所有核心页面元素的获取方法,类里面提供操作页面元素的所有方法. 这个框架实现几点 ...

  5. 如何对U盘的使用权限进行管控

    对U盘的使用权限进行管控是保护企业信息安全的一项重要措施.以下是一些常见的方法,可帮助您有效管理和控制U盘的使用权限: 禁用U盘端口: 在公司计算机上禁用或限制USB端口的使用,特别是那些不需要使用U ...

  6. Android WebView 缓存处理

    加载html时,会在data/应用下生成database和cache两个文件夹:请求的url存在webviewcache.db下面,url的内容保存在webviewCache下面, Webview的两 ...

  7. 【GIT-精讲】从零玩转Git-基础理论

    关于版本控制 一.什么是版本控制 版本控制(Version Control Systems)版本控制(Revision control)是一种软件工程技巧 在开发的过程中,确保由不同人所编辑的同一档案 ...

  8. C# / VB.NET 获取PDF文档的数字签名信息

    文档中的数字签名具有不可否认性,可有效防伪防篡改.对文档中已有的数字签名信息,可通过一定方法获取,下面通过程序代码介绍如何来实现.程序中,使用了Spire.PDF.dll,版本:6.11.6,可自行在 ...

  9. 看完这篇,DWS故障修复不再愁

    摘要:本文详细梳理分析了DWS服务面临软硬件故障场景和对应的修复原理,希望借此能够让你对DWS的集群故障修复有个全面深入的了解. 本文分享自华为云社区<GaussDB(DWS)故障修复系统性介绍 ...

  10. 网络知识一箩筐:IP地址划分的那些知识点

    摘要:IP地址是怎么划分的呢?划分的依据是什么呢?本节小课将带你一起学习IP地址划分.子网划分.子网掩码.CIDR等网络基础概念,了解IP地址划分背后的那些故事. 首先,回忆一下,前面小课中我们有提到 ...