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. ubuntu14.04搭建Hadoop2.9.0集群(分布式)环境

    本文进行操作的虚拟机是在伪分布式配置的基础上进行的,具体配置本文不再赘述,请参考本人博文:ubuntu14.04搭建Hadoop2.9.0伪分布式环境 本文主要参考 给力星的博文——Hadoop集群安 ...

  2. python中sorted()函数的用法

    一. 定义 sorted()函数对所有可迭代的对象进行排序操作 二. 语法 sorted(iterable [, key[, reverse]]]) iterable:可迭代对象 key:主要是用来进 ...

  3. 四十三 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

    1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项, ...

  4. 卡尔曼滤波——基本假设(1)线性系统(2)高斯分布 根据x(t) 求解x(t+1)

    from:https://blog.csdn.net/u010720661/article/details/63253509 原文链接:http://www.bzarg.com/p/how-a-kal ...

  5. QT Designer 的汉化

    Designer是很好用的设计器,通过 pip 安装PyQt5之后,一般都是英文的 所以给有需要的人带来汉化的包(这个是通过替换  translations 文件夹来实现的) translations ...

  6. input type=file 怎么样调取用户手机照相机

    input 有个属性accept="image/*" 这样就可以了,同时在网上看到了其他答案,试了下没啥效果.写记录下来 如下: 使用input:file标签, 去调用系统默认相机 ...

  7. angualr4 环境搭建

    不得不说现在很流行前端MVC框架,angularjs算是一种.以前也用过angularjs感觉还不错,刷新了我对前端的认知.特别是因为我本身是个java开发.但是感觉还是有很多缺点的,直到angula ...

  8. python之懒惰属性(延迟初始化)

    Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直接返回该结果.延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求. 1. ...

  9. rabbitmq java

    package com.enniu.rabbitmq; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.AMQP.BasicPr ...

  10. EMMC架构

    现在EMMC盛行,分析总结还是很有必要的.以下以全志a64为实例切入主题. 这里a64有三个sdc0~2,硬件上sdc2是连接EMMC,这里只分析sdc2的代码. 初始化的代码在linux-3.10/ ...