java stream optional_java成神之——Stream和Optional

Stream流

基本使用

Stream myStream = Stream.of("a", "", "b", "c", "d");

myStream.filter(item -> item!="").map(String::toUpperCase).sorted().forEach(System.out::println); // ABCD

使用流注意点:

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

终端方法如:count() collect() forEach()

流关闭

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

try (Stream lines = Files.lines(Paths.get("C:\\Users\\26401\\Desktop\\demo.txt")).onClose(() -> System.out.println("流自动关闭了"))) {

lines.forEach(System.out::println);

}

平行流

处理顺序:

上面介绍的例子都是顺序流,但是如果对元素的顺序不要求的时候可以使用平行流,开启多核心多线程加速处理速度

List list = Arrays.asList(1,2,3,4,5);

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

System.out.println("---------------");

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

1 2 3 4 5

---------------

3 5 4 2 1

使用平行流注意点:

在开发网络程序的时候,使用平行流会显著降低性能,因为只有一个分支-合并流

除了这一点以外,平行流的性能根据cpu的核心数决定

Stream.of("a", "b").parallel();

Arrays.asList("a", "b").parallelStream();

流重用

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

Iterable iterable = () -> IntStream.range(1, 10).map(i -> ++i).iterator();

for (Integer item : iterable) {

System.out.println(item);

}

iterator转换成流

Iterator iterator = Arrays.asList("A", "B", "C").iterator();

Spliterator spliterator = Spliterators.spliteratorUnknownSize(iterator, 0);

Stream stream = StreamSupport.stream(spliterator, false);

stream.forEach(System.out::println);

分组计数

Stream

.of("a", "b", "a", "c")

.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))

.entrySet()

.forEach(System.out::println);

a=2

b=1

c=1

无限流

方式一:

IntStream naturalNumbers = IntStream.iterate(1, x -> x + 1);

naturalNumbers.limit(5).forEach(System.out::println);

方式二:

Stream infiniteRandomNumbers = Stream.generate(Math::random);

infiniteRandomNumbers.limit(10).forEach(System.out::println);

流转集合

方式一:

List list = Stream.of("a", "b", "c").collect(Collectors.toList());

方式二:

List list = Stream.of("a", "b", "c").collect(Collectors.toCollection(ArrayList::new));

方式三:

List list = Stream.of("a", "b", "c").collect(Collectors.toCollection(() -> new ArrayList<>()));

压缩流

List list1 = Arrays.asList("a", "b");

List list2 = Arrays.asList("c", "d");

List list3 = Arrays.asList("e", "f");

List joinList = Stream.of(list1, list2, list3).flatMap(Collection::stream).collect(Collectors.toList());

或者

List joinList = Stream.of(list1, list2, list3).flatMap(List::stream).collect(Collectors.toList());

// ["a","b","c","d","e","f"]

统计数值流

IntSummaryStatistics

LongSummaryStatistics

DoubleSummaryStatistics

IntSummaryStatistics stats = Stream.of(1, 2, 3).mapToInt(x -> x).summaryStatistics();

stats.toString(); // IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}

集合转换流遍历

String[] names = { "Jon", "Darin", "Bauke", "Hans", "Marc" };

IntStream.range(0, names.length).mapToObj(i -> String.format("#%d %s", i + 1, names[i])).forEach(System.out::println);

流拼接

Stream.concat(Arrays.asList("a", "b", "c").stream(), Arrays.asList("d", "e", "f").stream());

reduce

reduce方法的作用类似于码积木

OptionalInt result = IntStream.range(1, 10).reduce((b,l) -> b+l); // 45

int result = IntStream.range(1, 10).reduce(100, (b,l) -> b+l); // 145

使用流生成随机字符串

SecureRandom 实例化开销很大,可以使用setSeed重置

下面生成的随机字符串只包含数字和字母

SecureRandom sr = new SecureRandom();

sr.setSeed(sr.generateSeed(20));

int length = 20;

Stream randomCharStream = sr.ints(Character.MIN_CODE_POINT,Character.MAX_CODE_POINT).mapToObj(i -> (char)i).filter(c -> c >= '0' && c <= 'z' && Character.isLetterOrDigit(c)).limit(length);

String randomString = randomCharStream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();

流的包装流

几种包装流

PrintWriter 自动调用OutputStreamWriter,允许写原始数据类型和字符串

OutputStreamWriter 将OutputStreams转换成Writers从而来处理字符而不是字节

BufferedOutputStream/BufferedInputStream OutputStreams处理字节是一个一个的来处理的,这个流是一块儿一块儿来处理的

DeflaterOutputStream/DeflaterInputStream 压缩数据

InflaterOutputStream/ InflaterInputStream 解压数据

CipherOutputStream/ CipherInputStream 加密数据

DigestOutputStream/ DigestInputStream 解密数据

CheckedOutputStream/CheckedInputStream

DataOutputStream/ DataInputStream 写字节

PrintStream 写字节

包装流写字符到文件

FileOutputStream stream = new FileOutputStream("C:\\Users\\26401\\Desktop\\demo.txt");

try(PrintWriter writer = new PrintWriter(new BufferedOutputStream(stream))){

writer.write("我是包装流写的字符串");

}

加密和压缩数据

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // “算法/工作模式/填充模式”

SecretKey secretKey = new SecretKeySpec("abcdefghigklmnop".getBytes(), "AES");

cipher.init(Cipher.ENCRYPT_MODE, secretKey);

try(BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream("C:\\Users\\26401\\Desktop\\demo.txt"), cipher)));) {

outputStream.write("加密数据".getBytes());

}

Optional

Optional的常用方法

Optional的使用方式类似于Stream

区别在于,方法不会管有没有调用终端方法,只会立即执行

ofNullable 如果值是null,则返回一个空的Optional

map

filter

get 获取值

orElse 默认值

orElseGet 默认值

orElseThrow 默认抛出异常

Optional的基本使用

String value = "abc";

String str = Optional.ofNullable(value).map(String::toUpperCase).orElse("NONE"); // ABC

String value = null;

String str = Optional.ofNullable(value).orElseGet(() -> "defaultValue"); // defaultValue

String value = null;

String str = Optional.ofNullable(value).orElseThrow(IllegalArgumentException::new);

int value = 123;

int result = Optional.ofNullable(value).filter(item -> item == 123).get();

原始数据类型

OptionalDouble

OptionalInt

OptionalLong

结语

本文章是java成神的系列文章之一

如果你想知道,但是本文没有的,请下方留言

我会第一时间总结出来并发布填充到本文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pythonplot绘图xrd_一种简化的截面动量组合测试[PythonMATLAB]

下面的例子来源书籍策略比较简单&#xff0c;使用N只股票构建投资组合&#xff0c;计算每只股票的过去LookBack(参数)日的动量&#xff0c;并作标准化处理作为股票权重&#xff0c;持有Holding(参数)日&#xff0c;其中权重允许为负数&#xff0c;即允许做空股票。简要说来就是…

腾讯自研分布式远程Shuffle服务Firestorm正式开源

11月4日&#xff0c;在2021腾讯数字生态大会上&#xff0c;腾讯宣布将开源自主研发的分布式远程Shuffle服务Firestorm。该服务的开源不但可以助推分布式计算的云原生部署&#xff0c;还能解决大数据分布式计算过程中的痛点&#xff0c;提升计算资源的利用率。 在分布式计算领域…

Flink 在有赞的实践和应用

简介&#xff1a; 本文介绍了Flink 在有赞的实践和应用&#xff0c;内容包括&#xff1a;Flink 的容器化改造和实践、Flink SQL 的实践和应用、未来规划。 作者&#xff1a;沈磊 一、Flink 的容器化改造和实践 1. 有赞的集群演进历史 2014 年 7 月&#xff0c;第一个 Storm…

用imspost制作catia后处理_这些有趣又精致的模型,都是用3D打印机打印出来的

3D打印已经出现在了生活的方方面面&#xff0c;有相当多别具一格又十分有趣的模型会让你惊艳。今天&#xff0c;小编搜集了一些有趣的3D打印模型&#xff0c;让我们一饱眼福。海边棕榈树来源&#xff1a;Curufin via Cults这个凉爽的棕榈树模型是由几个3D打印模型组合起来实现的…

java 黑窗运行_javaday1 如何使用黑窗口打出helloworld并且要学会使用和环境配置/eclipse...

java 第一天要学会如何使用黑窗口打出helloworld并且要学会使用和环境配置/eclipse其实我是一直都想早点儿写点儿学习笔记的&#xff0c;但是太懒了一直拖到了今天&#xff0c;好吧我已经学习了java一个月了&#xff0c;说一下自己的学习经历&#xff0c;当做一遍复习和巩固了&…

开课吧的python的证书_Python在生活中的几个实用场景,简直太厉害了

如今Python已经成为不少职场人心中的必备技能&#xff0c;他们掌握Python的一些使用方法后&#xff0c;在工作中不仅提高了效率&#xff0c;还获得了老板的嘉奖&#xff0c;可以说是两全其美。但有的人觉得学习Python只能为工作带来一些便捷&#xff0c;生活中Python也可以帮忙…

cdr 表格自动填充文字_做平面广告设计,AI和CDR如何选择?

关于CDR和AI两个软件&#xff0c;很多人都不知道它们有什么区别。今天我就给大家好好整理了一下。不知道两者区别&#xff0c;不知道该选用哪个软件的都来看看下面的AI和CAD教程吧。首先CorelDRAW是一款由世界顶尖软件公司之一的加拿大的Corel公司开发的图形图像软件。其非凡的…

麒麟信安:根植于openEuler,走操作系统自主创新之路

随着信息安全问题日益突出&#xff0c;行业内外也越来越深刻地认识到&#xff0c;核心技术受制于人是我们最大的隐患。而2020年12月8日&#xff0c;CentOS社区宣布CentOS8将于2021年底停止维护&#xff0c;CentOS7将于2024年6月30日停止维护&#xff0c;这一消息的发布&#xf…

Hologres如何支持超高基数UV计算(基于roaringbitmap实现)

简介&#xff1a; 本文将会介绍Hologres基于roaringbitmap实现超高基数的UV计算 RoaringBitmap是一种压缩位图索引&#xff0c;RoaringBitmap自身的数据压缩和去重特性十分适合对于大数据下uv计算。其主要原理如下&#xff1a; 对于32bit数, RoaringBitmap会构造2^16个桶&…

java 两个sql文_Java和SQL取两个字符间的值

JavaString str "abcdefg";String result str.substring(str.indexOf(">")1, str.lastIndexOf("StringUtils.substringBefore(“abcdec”, “c”); 结果是&#xff1a;ab 这里是以第一个”c”为标准。StringUtils.substringBeforeLast(“abcdec”…

阿里云贾扬清:大数据+AI工程化,让数据从「成本」变为「资产」

简介&#xff1a; 近年来&#xff0c;数字经济发展迅速&#xff0c;企业转型背后频频涌现「数字力量」的身影。云计算、大数据、人工智能的快速融合形成了数字经济的新基建&#xff0c;也为数字经济发展带来了新的机遇。 5 月 20 日&#xff0c;阿里巴巴副总裁、阿里云计算平台…

python如何改变数据类型_如何改变numpy数组的数据类型和形状?

数据类型的混合使得这种转换比通常更复杂。最后的答案是&#xff0c;将字段复制到目标数组具有速度和通用性的结合。在让我们构造一个示例&#xff1a;In [850]: dtOut[850]: dtype([(cycle, In [851]: xnp.zeros((3,),dt)In [852]: x[cycle][0,10,23]In [853]: x[dxn][3,2,2]I…

easyexcel 日期类型 convert_数据库的几种日期时间类型,你真的会用吗?

日期和时间是每个系统&#xff0c;每个数据库设计必不可少的部分。也是容易被大家忽视的部分。很多开发者可能根本不了解以不同类型存储日期和时间意味着什么。有朋友可能会说&#xff0c;数据库定义一个datetime或timestamp类型的字段&#xff0c;然后在Java代码中获取当前时间…

从重复到重用

简介&#xff1a; 开发技术的发展&#xff0c;从第一次提出“函数/子程序”&#xff0c;实现代码级重用&#xff1b;到面向对象的“类”&#xff0c;重用数据结构与算法&#xff1b;再到“动态链接库”、“控件”等重用模块&#xff1b;到如今流行的云计算、微服务可重用整个系…

JAVA中randomfile_java中的RandomAccessFile的用法

Java的RandomAccessFile提供对文件的读写功能&#xff0c;与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方。这就是“Random”的意义所在。RandomAccessFile的对象包含一个记录指针&#xff0c;用于标识当前流的读写位置&#xff0c;这个位置可以向…

官宣|Apache Flink 1.13.0 正式发布,流处理应用更加简单高效!

简介&#xff1a; Flink 1.13.0 版本让流处理应用的使用像普通应用一样简单和自然&#xff0c;并且让用户可以更好地理解流作业的性能。 ​翻译 | 高赟 Review | 朱翥、马国维 Flink 1.13 发布了&#xff01;Flink 1.13 包括了超过 200 名贡献者所提交的 1000 多项修复和优化…

lightning接口_Lightning太赚钱?iPhone永远不会用Type-C

欧盟日前通过了法案&#xff0c;要求在欧洲销售的各手机制造商要统一充电接口&#xff0c;全部采用USB Type-C接口&#xff0c;但这可能让一直使用Lightning(闪电)充电接口的Apple受到很大影响。虽说目前苹果的Mac电脑、iPad平板电脑以及智能音箱等部分产品都开始使用USB Type-…

这个冬天,头秃了,口袋也空了......

秋天里的第一杯奶茶刚喝完&#xff0c;冬天里的第一条秋裤就要安排上&#xff01;不让加班的程序员&#xff0c;从此的生活便不只有脑袋秃秃&#xff0c;还有口袋空空&#xff01;从外包出来&#xff0c;没想到新的面试让我手忙脚乱外包虐我千百遍&#xff0c;只能待她如初恋&a…

云数据仓库的未来趋势:计算存储分离

简介&#xff1a; 随着云时代的到来&#xff0c;数据库也开始拥抱云数据库时代&#xff0c;各类数据库系统在各内外云平台百花齐放&#xff0c;有开源的MySQL、PostgreSQL、MongoDB&#xff0c;传统数据库厂商的SQLServer、Oracle&#xff0c;云厂商自研的Aurora、Redshift、Po…

Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题

写在前面java内存申请和释放均是由jvm在控制。而释放往往会出现各种各样的问题&#xff0c;经常一个引用没处理好就引起内存泄漏&#xff0c;最后引发OOM。如果发生在重要业务系统还可能出现严重的生产事故。 因此内存使用一定要谨慎&#xff0c;特别是引用要及时断链。虽然jvm…