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的更多相关文章

  1. java成神之——文件IO

    文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStrea ...

  2. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  3. java成神之——集合框架之Maps,Hashtable

    集合 Maps HashMap 创建和初始化map 遍历方式 LinkedHashMap WeakHashMap TreeMap 线程锁 Hashtable 结语 集合 Maps HashMap Ma ...

  4. java成神之——集合框架之ArrayList,Lists,Sets

    集合 集合种类 ArrayList 声明 增删改查元素 遍历几种方式 空集合 子集合 不可变集合 LinkedList Lists 排序 类型转换 取交集 移动元素 删除交集元素 Sets 集合特点 ...

  5. java成神之——集合框架之Array

    Array 初始化 填充元素的几种方式 数组转流 遍历 数组转成字符串 排序 查找 数组扩大 原始类型数组和包装类型数组转换 移除元素 比较数组是否相等 克隆 类型转换 过滤元素 结语 Array 初 ...

  6. java成神之——java中string的用法

    java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取 ...

  7. 转载_2016,Java成神初年

    原文地址:http://blog.csdn.net/chenssy/article/details/54017826 2016,Java成神初年.. -------------- 时间2016.12. ...

  8. Java成神路上之设计模式系列教程之一

    Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...

  9. java成神之——安全和密码

    安全和密码 加密算法 公钥和私钥加密解密 生成私钥和公钥 加密数据 解密数据 公钥私钥生成的不同算法 密钥签名 生成加密随机数 基本用法 指定算法 加密对象 SealedObject Signatur ...

随机推荐

  1. zabbix报警优化

    常见rpc服务介绍 ---远程过程调用协议 常用的框架:阿里巴巴 Dubbo.微博 Motan.阿帕奇 thrift.谷歌 grpc Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架, ...

  2. IOS-支付宝

      一.使用支付宝进行一个完整的支付功能,大致有以下步骤: 与支付宝签约,获得商户ID(partner)和账号ID(seller) 下载相应的公钥私钥文件(加密签名用) 下载支付宝SDK 生成订单信息 ...

  3. 【Python】序列的方法

    任何序列都可以引用其中的元素(item). 下面的内建函数(built-in function)可用于列表(表,定值表,字符串) #s为一个序列 len(s) 返回: 序列中包含元素的个数 min(s ...

  4. 【转】Hibernate 原汁原味的四种抓取策略

    最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog ...

  5. 软工作业-Wc

    Wc.exe wc.exe是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单词数和行 ...

  6. Kali Linux:使用nmap扫描主机

    nmap-Network Mapper,是著名的网络扫描和嗅探工具包.他同样支持Windows和OS X. 扫描开放端口和判断操作系统类型 先让我们ping一段地址范围,找到启动的主机: # nmap ...

  7. php之opcodes

    opcode是一种php脚本编译之后的语言. 例如: <?php echo "Hello World"; $a = 1 + 1; echo $a; ?> php执行这段 ...

  8. [转载] ffmpeg 基本数据结构和对象: AVPacket、AVPicture、AVFrame

    一.AVPacket /** * AVPacket 作为解码器的输入 或 编码器的输出. * 当作为解码器的输入时,它由demuxer生成,然后传递给解码器 * 当作为编码器的输出时,由编码器生成,然 ...

  9. 因实现本地浏览器访问nginx修改配置文件后,安装vsftpd失败

    解决方法如下(修改dns配置) vi /etc/resolv.conf 在此文件最后加入:nameserver 8.8.8.8 如果没有vi编辑器可用: echo "nameserver 8 ...

  10. Oracle cursor_sharing 参数 详解

    一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 ...