java成神之——Stream和Optional
Stream流
基本使用
Stream<String> 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<String> lines = Files.lines(Paths.get("C:\\Users\\26401\\Desktop\\demo.txt")).onClose(() -> System.out.println("流自动关闭了"))) {
lines.forEach(System.out::println);
}
平行流
处理顺序:
上面介绍的例子都是顺序流,但是如果对元素的顺序不要求的时候可以使用平行流,开启多核心多线程加速处理速度
List<Integer> 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<Integer> iterable = () -> IntStream.range(1, 10).map(i -> ++i).iterator();
for (Integer item : iterable) {
System.out.println(item);
}
iterator转换成流
Iterator<String> iterator = Arrays.asList("A", "B", "C").iterator();
Spliterator<String> spliterator = Spliterators.spliteratorUnknownSize(iterator, 0);
Stream<String> 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<Double> infiniteRandomNumbers = Stream.generate(Math::random);
infiniteRandomNumbers.limit(10).forEach(System.out::println);
流转集合
方式一:
List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());
方式二:
List<String> list = Stream.of("a", "b", "c").collect(Collectors.toCollection(ArrayList::new));
方式三:
List<String> list = Stream.of("a", "b", "c").collect(Collectors.toCollection(() -> new ArrayList<>()));
压缩流
List<String> list1 = Arrays.asList("a", "b");
List<String> list2 = Arrays.asList("c", "d");
List<String> list3 = Arrays.asList("e", "f");
List<String> joinList = Stream.of(list1, list2, list3).flatMap(Collection::stream).collect(Collectors.toList());
或者
List<String> 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<Character> 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成神的系列文章之一
如果你想知道,但是本文没有的,请下方留言
我会第一时间总结出来并发布填充到本文
java成神之——Stream和Optional的更多相关文章
- java成神之——文件IO
文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStrea ...
- java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作
ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...
- java成神之——集合框架之Maps,Hashtable
集合 Maps HashMap 创建和初始化map 遍历方式 LinkedHashMap WeakHashMap TreeMap 线程锁 Hashtable 结语 集合 Maps HashMap Ma ...
- java成神之——集合框架之ArrayList,Lists,Sets
集合 集合种类 ArrayList 声明 增删改查元素 遍历几种方式 空集合 子集合 不可变集合 LinkedList Lists 排序 类型转换 取交集 移动元素 删除交集元素 Sets 集合特点 ...
- java成神之——集合框架之Array
Array 初始化 填充元素的几种方式 数组转流 遍历 数组转成字符串 排序 查找 数组扩大 原始类型数组和包装类型数组转换 移除元素 比较数组是否相等 克隆 类型转换 过滤元素 结语 Array 初 ...
- java成神之——java中string的用法
java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取 ...
- 转载_2016,Java成神初年
原文地址:http://blog.csdn.net/chenssy/article/details/54017826 2016,Java成神初年.. -------------- 时间2016.12. ...
- Java成神路上之设计模式系列教程之一
Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...
- java成神之——安全和密码
安全和密码 加密算法 公钥和私钥加密解密 生成私钥和公钥 加密数据 解密数据 公钥私钥生成的不同算法 密钥签名 生成加密随机数 基本用法 指定算法 加密对象 SealedObject Signatur ...
随机推荐
- zabbix报警优化
常见rpc服务介绍 ---远程过程调用协议 常用的框架:阿里巴巴 Dubbo.微博 Motan.阿帕奇 thrift.谷歌 grpc Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架, ...
- IOS-支付宝
一.使用支付宝进行一个完整的支付功能,大致有以下步骤: 与支付宝签约,获得商户ID(partner)和账号ID(seller) 下载相应的公钥私钥文件(加密签名用) 下载支付宝SDK 生成订单信息 ...
- 【Python】序列的方法
任何序列都可以引用其中的元素(item). 下面的内建函数(built-in function)可用于列表(表,定值表,字符串) #s为一个序列 len(s) 返回: 序列中包含元素的个数 min(s ...
- 【转】Hibernate 原汁原味的四种抓取策略
最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog ...
- 软工作业-Wc
Wc.exe wc.exe是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单词数和行 ...
- Kali Linux:使用nmap扫描主机
nmap-Network Mapper,是著名的网络扫描和嗅探工具包.他同样支持Windows和OS X. 扫描开放端口和判断操作系统类型 先让我们ping一段地址范围,找到启动的主机: # nmap ...
- php之opcodes
opcode是一种php脚本编译之后的语言. 例如: <?php echo "Hello World"; $a = 1 + 1; echo $a; ?> php执行这段 ...
- [转载] ffmpeg 基本数据结构和对象: AVPacket、AVPicture、AVFrame
一.AVPacket /** * AVPacket 作为解码器的输入 或 编码器的输出. * 当作为解码器的输入时,它由demuxer生成,然后传递给解码器 * 当作为编码器的输出时,由编码器生成,然 ...
- 因实现本地浏览器访问nginx修改配置文件后,安装vsftpd失败
解决方法如下(修改dns配置) vi /etc/resolv.conf 在此文件最后加入:nameserver 8.8.8.8 如果没有vi编辑器可用: echo "nameserver 8 ...
- Oracle cursor_sharing 参数 详解
一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 ...