java成神之——Stream和Optional

  • Stream流

    • 基本使用
    • 流关闭
    • 平行流
    • 流重用
    • iterator转换成流
    • 分组计数
    • 无限流
    • 流转集合
    • 压缩流
    • 统计数值流
    • 集合转换流遍历
    • 流拼接
    • reduce
    • 使用流生成随机字符串
    • 流的包装流
      • 几种包装流
      • 包装流写字符到文件
      • 加密和压缩数据
  • Optional
    • Optional的常用方法
    • 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成神的系列文章之一

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

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

原文地址:https://www.cnblogs.com/ye-hcj/p/9750110.html

时间: 2024-08-30 00:39:52

java成神之——Stream和Optional的相关文章

java成神之——文件IO

文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStream和FileInputStream复制文件 FileWriter FileReader BufferedWriter BufferedReader 基本用法 StringWriter InputStreams转换成字符串 BufferedInputStream ObjectOutputStream

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

java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取指定位置字符和replace的使用 StringBuffer的使用 字符串转换 基本类型的转换 添加字符编码 Base64的编码和解码 结语 java中String的用法 String基本用法 字符串一旦创建在堆中就不可变 字符串声明 String str = "你好"; String s

2016,Java成神初年

时间2016.12.31 01:51 地点K9004 5号车厢 1号下铺 此刻 深夜 不眠 回想 反思 规划! 工作快四年了,每年经历不同,心思不同!2013,从学生到职场人的转变,在长沙工作半年,第一感觉轻松和新鲜!但我觉得长沙不适合我,我要离开,所以告诉自己我要去深圳!2014,年初八杀入深圳,开始自己的苦逼人生,来到创业公司,各种加班,各种出差.2014最大收获是交了媳妇.2015,坑爹一年,心浮躁了,没有好好学习,工作很忙,各种加班,进步很小,年底感觉不能在呆了.2016,年初9立马辞职

java成神之——注释修饰符

注释修饰符 自定义注释 元注释 通过反射在runtime访问注释 内置注释 多注释实例 错误写法 使用容器改写 使用@Repeatable元注释 注释继承 使用反射获取注释 获取类的注释 获取方法的注释 结语 注释修饰符 自定义注释 元注释 用来注释自定义注释的注释 @Target 限定注释允许加载的目标 @Target(ElementType.METHOD) 只能用于方法 @Target({ElementType.FIELD, ElementType.TYPE}) 可以用于字段和类型 ANNO

java成神之——enum枚举操作

枚举 声明 枚举遍历 枚举在switch中使用 枚举比较 枚举静态构造方法 使用类来模拟枚举 枚举中定义抽象方法 枚举实现接口 单例模式 使用静态代码快 EnumSet EnumMap 结语 枚举 声明 基本使用 public enum ChineseNumber { YI, ER, SAN, SI } ChineseNumber.values(); // ["YI","ER","SAN","SI"] 枚举遍历 for (Ch

java成神之——properties,lambda表达式,序列化

Properties 加载defaults.properties文件 写Properties到xml文件 读Properties从xml文件 Lambda表达式 自定义 内置 sort方法中使用Lambada 序列化 文件序列化 Gson序列化 Jackson序列化 Comparable和Comparator Comparable对象排序 Comparator对象排序 结语 Properties 加载defaults.properties文件 defaults.properties内容如下 la

java成神之——正则表达式基本使用

正则表达式 常用匹配规则 基本使用 标记符的使用 部分正则标记 正则表达式在字符串方法中的使用 结语 正则表达式 常用匹配规则 [abc] abc其中一个 [^abc] abc之外的一个 [a-z] a和z之间的一个 . 表示任意字符 \d 表示一个数字 \D 非数字 \w 表示a-zA-Z0-9_ \W 非a-zA-Z0-9_ ^ 开头 $ 结尾 \b 英文单词边界 ? 一次或者0次 * 零次或者多次 + 一次或者多次 {n} 出现制定n次 {n,} 至少n次 {n,m} >=n <=m 次

java成神之——HttpURLConnection访问api

HttpURLConnection 访问get资源 访问post资源 访问Delete资源 获取状态码 结语 HttpURLConnection 访问get资源 HttpURLConnection connection = (HttpURLConnection)new URL("http://ip/test").openConnection(); int responseCode = connection.getResponseCode(); InputStream inputStre

java成神之——Fork/Join基本使用

Fork/Join 大任务分小任务,小任务结果合并 ForkJoinPool pool = new ForkJoinPool(); RecursiveTask<Integer> task1 = new RecursiveTask<Integer>() { @Override public Integer compute() { return 100 + 100; } }; RecursiveTask<Integer> task2 = new RecursiveTask&