java成神之——Stream和Optional

<!-- TOC -->
  • Stream流
    • 基本使用
    • 流关闭
    • 平行流
    • 流重用
    • iterator转换成流
    • 分组计数
    • 无限流
    • 流转集合
    • 压缩流
    • 统计数值流
    • 集合转换流遍历
    • 流拼接
    • reduce
    • 使用流生成随机字符串
    • 流的包装流
      • 几种包装流
      • 包装流写字符到文件
      • 加密和压缩数据
  • Optional
    • Optional的常用方法
    • Optional的基本使用
    • 原始数据类型
  • 结语
<!-- /TOC -->

Stream流

基本使用

1Stream<String> myStream = Stream.of("a", "", "b", "c", "d"); 2myStream.filter(item -> item!="").map(String::toUpperCase).sorted().forEach(System.out::println); // ABCD 3 4使用流注意点: 5 如果一个流没有调用终端方法,那么流的其他操作都不会执行 6 7 终端方法如:count() collect() forEach()

流关闭

1流用来操作文件的时候才需要手动关闭,单独使用Stream不需要关闭 2 3try (Stream<String> lines = Files.lines(Paths.get("C:\\Users\\26401\\Desktop\\demo.txt")).onClose(() -> System.out.println("流自动关闭了"))) { 4 lines.forEach(System.out::println); 5}

平行流

1处理顺序: 2 3 上面介绍的例子都是顺序流,但是如果对元素的顺序不要求的时候可以使用平行流,开启多核心多线程加速处理速度 4 5 List<Integer> list = Arrays.asList(1,2,3,4,5); 6 list.stream().forEach(System.out::println); 7 8 System.out.println("---------------"); 9 list.parallelStream().forEach(System.out::println); 10 11 1 2 3 4 5 12 --------------- 13 3 5 4 2 1 14 15使用平行流注意点: 16 17 在开发网络程序的时候,使用平行流会显著降低性能,因为只有一个分支-合并流 18 除了这一点以外,平行流的性能根据cpu的核心数决定 19 Stream.of("a", "b").parallel(); 20 Arrays.asList("a", "b").parallelStream();

流重用

1流本身是不能重用的,但是可以使用iterator来实现重用 2 3Iterable<Integer> iterable = () -> IntStream.range(1, 10).map(i -> ++i).iterator(); 4for (Integer item : iterable) { 5 System.out.println(item); 6}

iterator转换成流

1Iterator<String> iterator = Arrays.asList("A", "B", "C").iterator(); 2Spliterator<String> spliterator = Spliterators.spliteratorUnknownSize(iterator, 0); 3Stream<String> stream = StreamSupport.stream(spliterator, false); 4stream.forEach(System.out::println);

分组计数

1Stream 2.of("a", "b", "a", "c") 3.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 4.entrySet() 5.forEach(System.out::println); 6 7a=2 8b=1 9c=1

无限流

1方式一: 2 IntStream naturalNumbers = IntStream.iterate(1, x -> x + 1); 3 naturalNumbers.limit(5).forEach(System.out::println); 4 5方式二: 6 Stream<Double> infiniteRandomNumbers = Stream.generate(Math::random); 7 infiniteRandomNumbers.limit(10).forEach(System.out::println);

流转集合

1方式一: 2 List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList()); 3 4方式二: 5 List<String> list = Stream.of("a", "b", "c").collect(Collectors.toCollection(ArrayList::new)); 6 7方式三: 8 List<String> list = Stream.of("a", "b", "c").collect(Collectors.toCollection(() -> new ArrayList<>()));

压缩流

1List<String> list1 = Arrays.asList("a", "b"); 2List<String> list2 = Arrays.asList("c", "d"); 3List<String> list3 = Arrays.asList("e", "f"); 4 5List<String> joinList = Stream.of(list1, list2, list3).flatMap(Collection::stream).collect(Collectors.toList()); 6或者 7List<String> joinList = Stream.of(list1, list2, list3).flatMap(List::stream).collect(Collectors.toList()); 8// ["a","b","c","d","e","f"]

统计数值流

1IntSummaryStatistics 2LongSummaryStatistics 3DoubleSummaryStatistics 4 5IntSummaryStatistics stats = Stream.of(1, 2, 3).mapToInt(x -> x).summaryStatistics(); 6 7stats.toString(); // IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}

集合转换流遍历

1String[] names = { "Jon", "Darin", "Bauke", "Hans", "Marc" }; 2IntStream.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

1reduce方法的作用类似于码积木 2 3OptionalInt result = IntStream.range(1, 10).reduce((b,l) -> b+l); // 45 4int result = IntStream.range(1, 10).reduce(100, (b,l) -> b+l); // 145

使用流生成随机字符串

1SecureRandom 实例化开销很大,可以使用setSeed重置 2 3下面生成的随机字符串只包含数字和字母 4 5 SecureRandom sr = new SecureRandom(); 6 7 sr.setSeed(sr.generateSeed(20)); 8 int length = 20; 9 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); 10 String randomString = randomCharStream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();

流的包装流

几种包装流

1PrintWriter 自动调用OutputStreamWriter,允许写原始数据类型和字符串 2 3OutputStreamWriter 将OutputStreams转换成Writers从而来处理字符而不是字节 4 5BufferedOutputStream/BufferedInputStream OutputStreams处理字节是一个一个的来处理的,这个流是一块儿一块儿来处理的 6 7DeflaterOutputStream/DeflaterInputStream 压缩数据 8 9InflaterOutputStream/ InflaterInputStream 解压数据 10 11CipherOutputStream/ CipherInputStream 加密数据 12 13DigestOutputStream/ DigestInputStream 解密数据 14 15CheckedOutputStream/CheckedInputStream 16 17DataOutputStream/ DataInputStream 写字节 18 19PrintStream 写字节

包装流写字符到文件

1FileOutputStream stream = new FileOutputStream("C:\\Users\\26401\\Desktop\\demo.txt"); 2try(PrintWriter writer = new PrintWriter(new BufferedOutputStream(stream))){ 3 writer.write("我是包装流写的字符串"); 4}

加密和压缩数据

1Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // “算法/工作模式/填充模式” 2SecretKey secretKey = new SecretKeySpec("abcdefghigklmnop".getBytes(), "AES"); 3cipher.init(Cipher.ENCRYPT_MODE, secretKey); 4try(BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream("C:\\Users\\26401\\Desktop\\demo.txt"), cipher)));) { 5 outputStream.write("加密数据".getBytes()); 6}

Optional

Optional的常用方法

1Optional的使用方式类似于Stream 2 3区别在于,方法不会管有没有调用终端方法,只会立即执行 4 5ofNullable 如果值是null,则返回一个空的Optional 6map 7filter 8get 获取值 9orElse 默认值 10orElseGet 默认值 11orElseThrow 默认抛出异常

Optional的基本使用

1String value = "abc"; 2String str = Optional.ofNullable(value).map(String::toUpperCase).orElse("NONE"); // ABC 3 4String value = null; 5String str = Optional.ofNullable(value).orElseGet(() -> "defaultValue"); // defaultValue 6 7String value = null; 8String str = Optional.ofNullable(value).orElseThrow(IllegalArgumentException::new); 9 10int value = 123; 11int result = Optional.ofNullable(value).filter(item -> item == 123).get();

原始数据类型

1OptionalDouble 2OptionalInt 3OptionalLong

结语

1本文章是java成神的系列文章之一 2 3如果你想知道,但是本文没有的,请下方留言 4 5我会第一时间总结出来并发布填充到本文
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )