`

Java8 随笔记录(三)

    博客分类:
  • jdk8
阅读更多

关于流的使用,Stream API提供了很多的操作

 

1、常用操作

stream.filter(vo -> vo.getAge()>25).distinct().skip(3).limit(6)
.collect(Collectors.toList());

// distinct 去重,排除重复元素
// skip 跳过,即扔掉前n个元素
// limit 截断流,返回n个元素,与skip组合可作为内存上的分页

 

2、map + flatMap 之间的联系:

// 直接使用map打印: i: 1i: 3i: 5
// 使用flatMap打印:
// i: 1j: 7
// j: 8
// i: 3j: 7
// j: 8
// i: 5j: 7
// j: 8
List<Integer> one = Lists.newArrayList(1, 3, 5);
List<Integer> two = Lists.newArrayList(7, 8);
one.stream().flatMap(i -> {
     System.out.print("i: " + i + "\t");
 
     return two.stream().map(j -> {
           System.out.println("j: " + j);
           return new int[]{i, j};
     });
}).count();

当使用map时,鼠标移到map上去看会显示:

<Stream<Object>> Stream<Stream<Object>> java.util.stream.Stream.map(Function<? super Integer, ? extends Stream<Object>> mapper)

而当使用flatMap时,会显示:

<Object> Stream<Object> java.util.stream.Stream.flatMap(Function<? super Integer, ? extends Stream<? extends Object>> mapper)

也就是说,flatMap是先map然后再flat,这一点和spark中的map/flatMap类似。

其次,看别人博客里有介绍,flatMap方法会让你把流中的每一个值都转换成另一个流,然后把所有流连接起来成为一个流。

 

3、查找和匹配

对于这一点,Stream API提供的有allMatch、anyMatch、noneMatch、findFirst、findAny这些函数。

allMatch,当所有元素都匹配条件时才为真。
anyMatch,也就是只要有一个元素匹配就为真了。
noneMatch,和allMatch相反,即所有元素都不匹配时才为真。
findFirst,返回第一个元素,当多线程的时候可能会出现问题,所以当不是特意指定返回第一个元素时,
可以使用findAny来处理会更好一些。
findAny,返回当前流中的任意元素,当没有满足条件的元素时,避免返回null,java8新增了一个
Optional<T>类来避免空指针。

 

4、Optional的常规操作:

// 当Optional中存在值的时候返回true,否则返回false。
isPresent()
// 当Optional中存在值的时候才会执行Consumer块,否则不执行。
ifPresent(Consumer<T> block)
// 当Optional中存在值的时候返回值,否则抛NoSuchElementException异常。
T get()
// 当Optional中存在值的时候返回值,否则返回默认值。
T orElse(T other)
-------------------------------------
// 返回一个空的Optional实例
Optional<T> empty() 
// 将指定值用Optional封装之后再返回,如果value为null,则抛出异常
Optional<T> of(T value) 
// 将指定值用Optional封装之后再返回,如果value为null,则返回空的Optional对象
Optional<T> ofNullable(T value)
// 如果值存在并且满足Predicate条件,就返回该对象,否则返回一个空的Optional对象
Optional<T> filter(Predicate<? super T> predicate)
// 如果值存在,就对该值执行Function
Optional<U> map(Function<? super T, ? extends U> mapper)
// 如果值存在,就对该值执行Function,否则返回空的Optional对象
Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
// 如果有值就返回,否则返回由Supplier生成的值
T orElseGet(Supplier<? extends T> other)
// 如果有值就返回,否则返回由Supplier生成的异常
T orElseThrow(Supplier<? extends X> exceptionSupplier)
// 判断对象相等
boolean equals(Object obj)
具体的使用效果可以自己去实践操作下。

 

5、reduce的相关规约:

求和:
System.out.println(Lists.newArrayList(1,2,3,4,5).parallelStream()
.reduce(0, Integer::sum)); //15
System.out.println(Lists.newArrayList(1,2,3,4,5).parallelStream()
.mapToInt(s -> s).max()); //15,先将其转成java.util.stream.IntStream原始类型流
最大值:
System.out.println(Lists.newArrayList(1,2,3,4,5).stream()
.reduce(0, Integer::max)); //5
System.out.println(Lists.newArrayList(1,2,3,4,5).stream()
.mapToInt(s -> s).max()); //5
最小值:
System.out.println(Lists.newArrayList(1,2,3,4,5).stream()
.reduce(0, Integer::min)); //此处并不是1,而是默认值0
System.out.println(Lists.newArrayList(1,2,3,4,5).stream()
.mapToInt(s -> s).min()); //0
平均数:
System.out.println(Lists.newArrayList(1,2,3,4,5).stream()
.mapToInt(s -> s).average()); //OptionalDouble[3.0],
此处之所以返回类型是OptionalDouble而不直接是double,是因为流中可能没有值,
而为了避免null空指针,就采用了Optional模式。
通过mapToInt、mapToLong、mapToDouble返回的都是原始类型流,当然也可以回转成对象流,
只需要直接intStream.boxed()即可。

 

6、创建流

还是延用以前的一个例子:

// Stream.of 方式创建流
List<String> list = Stream.of("one", "two", "three", "four")
            .filter(e -> e.length() > 3)
            .peek(e -> System.out.println("Filtered value: " + e))
            .map(String::toUpperCase)
            .peek(e -> System.out.println("Mapped value: " + e))
            .collect(Collectors.toList());
// peek 可以在流的执行过程中保持流状态不变的情况下执行别的操作,可做日志打印
// Filtered value: three
// Mapped value: THREEfc
// Filtered value: four
// Mapped value: FOUR
 
// 创建一个[1, 10]区间大小的流
IntStream.rangeClosed(1, 10); 
 
// 用数组来创建流
Arrays.stream(new String[]{"wsbs","xwzx","bmfw","wshd"});
 
// 用文件生成流
Files.lines(Paths.get(new URI("/Users/Max/Documents/java8.pages")));
 
// 使用iterate来迭代生成一个无限流,此处使用limit进行了截断
Stream.iterate(0, n -> ++n).limit(6);
 
// 使用generate来生成一个无限流, 打印2个6
 
Stream.generate(() -> 6).limit(2).forEach(System.out::println); 

 

分享到:
评论

相关推荐

    java记录随笔

    Java 记录随笔 Java 记录随笔是关于 Java 软件架构设计的笔记,涵盖了软件架构的基本原则、当前流行的技术、数据库存储结构、Web 界面用户接口层、业务层架构、持久层技术、XML 结构化信息传输和存储的重要性等多个...

    ubuntu搭建Java项目运行环境-随笔记录.rar

    JAVA_HOME="/usr/lib/jvm/java-8-oracle" PATH="$PATH:$JAVA_HOME/bin" ``` 保存并关闭文件,然后使更改生效: ```bash source /etc/environment ``` 接下来,我们需要安装MySQL 5.7。同样地,使用apt来安装: `...

    Java学习随笔7(进制).docx

    每四位二进制数对应一个十进制数,如二进制的1101代表十进制的13,因为1*8 + 1*4 + 0*2 + 1*1 = 8 + 4 + 0 + 1 = 13。8421码在某些特定的数字处理场景中很有用,如电子表格软件或计算器。 Java中的位运算,如与(&)...

    工作随笔-记录遇到的知识点

    在Java世界,Map对象转换为实体类通常是通过ORM框架如MyBatis Plus完成的,而实体类转化为JSON则可以借助Jackson或Gson库。例如,使用Gson库,可以写成`Gson gson = new Gson(); String jsonString = gson.toJson...

    Java基于SWT编写记事本

    9. **帮助文档**:附带的开发随笔手册可能包含关于如何使用该记事本的详细说明,对于初学者来说非常有帮助。 开发这样的程序需要对Java语言、SWT库以及面向对象设计有深入理解。通过这个项目,开发者不仅可以掌握...

    2014210-2014307笔记随笔

    标题“2014210-2014307笔记随笔”暗示了这是一份时间跨度从2014年2月10日至3月7日的个人学习记录,可能包含了作者在IT领域的所学所悟,特别是关于编程、软件开发或系统设计的思考。由于描述部分为空,我们无法直接...

    Android App_云随笔课程设计

    在开发“Android App_云随笔课程设计”项目时,我们面临的是构建一个移动应用程序,旨在帮助用户便捷地记录他们的日常生活、旅行体验、心情点滴以及学习笔记等。这个应用程序的关键特性在于其同步功能,它将用户的...

    JavaThings:共享与Java相关的东西-Java安全漫谈笔记相关内容

    JavaThings-Java安全漫谈笔记相关《 Java安全漫谈》是我在写的一点Java学习相关的随笔,不是很严谨,也不是啥高科技。这个存储库主要是记录并整理一下,附加一些代码。Java安全漫谈目录 人口统计字节码:远程字节码...

    Ibatis学习随笔.doc

    Ibatis 是一款轻量级的Java持久层框架,它的核心思想是将SQL语句与Java代码分离,使得开发者可以更加灵活地控制SQL的编写,同时避免了传统的JDBC中的大量模板代码,提高了开发效率和代码的可维护性。在本文中,我们...

    DCSweb随笔

    例如,可能会讲解使用如Python、C++或Java等语言进行系统开发,或者如何利用现有的开源项目如OPC-UA、Modbus等进行通信协议的实现。源码分析部分可能涉及代码调试、性能优化和错误处理等内容。 “工具”标签表明...

    Log4j2手册阅读随笔(Log4j2新特性)

    Apache Log4j2 是一个广泛使用的Java日志记录库,它提供了一个强大和灵活的方式来记录应用程序事件。Log4j2手册详细介绍了该库的各个方面,包括架构、迁移、API、配置、Web应用程序集成、插件、查找、Appenders、...

    基于JAVA的幼儿园家园共育平台设计与实现-需求.zip

    基于JAVA幼儿园家园共育平台设计与实现 开发语言 JavaWeb前端语言  开发工具:六年特雷利JIDEA ...童言稚语:每月记录一次幼儿有趣的话语,文字展示。 育儿头条:育儿新闻文章。管理员上传,可评论点赞

    java源码博客-source:个人博客,记录一些学习和实践的总结

    java 源码 博客 一杯82年的JAVA 大家好,我是练习时常两年半的JAVA练习生,爱好是 ...博客专用仓库,主要记录一些学习和实践的总结,感兴趣的朋友可以点个watch或star。 随笔 探索JAVA并发 从0.5到1写个RPC框架

    阶段程序汇总

    无论是通过阅读"课堂问题随笔.txt"来解决疑惑,还是通过"必须记住的代码君们"来熟悉常用代码,亦或是通过"Entertainment"中的项目来提升编程技巧,都能有效地促进Java学习的进程。同时,"总结文件"和"瞎搞"部分则...

    随笔集

    1. **技术基础知识**:随笔可能涵盖基础的编程语言知识,如Python、Java或C++的语法特性,数据结构和算法的应用,以及软件工程的基本原则。 2. **项目经验分享**:作者可能会分享他们在实际项目中遇到的问题及解决...

    java版植物大战僵尸源码-Todo:定个计划好好学习

    列表参考国光大佬的国光的安全随笔记录 安全技能 该技能表不用按顺序进行学习,但是比较高级的我会放最后面,因为我也不会,需要花时间慢慢加。 总结我这几年的一点经验:安全需要学习的技术太多了,特别是红队、...

    JVM自动内存管理机制

    Java自动内存管理机制包含两部分:内存分配和内存回收,要想理解内存分配和回收的机制,则需要了解下Java内存区域(Java运行时数据区),这篇随笔将按照下面的线索进行逐步解析:1.Java运行时数据区2.对象“已死”的...

    Logger.rar

    3. 在代码中使用:在Java代码中,通过Logger类获取日志实例,然后调用如info(), warn(), error()等方法记录日志。 四、日志子文件Logger 压缩包中的"Logger"可能是具体的日志实现类或配置文件。如果是类文件,它...

    MiaoWu:毕业设计-流浪猫收养系统

    MiaoWu毕业设计-流浪猫收养系统过程随笔记录通知:1.用户关注用户2.关注的用户发帖3.帖子审核结果4.领养申请5.领养审核结果发帖:需发帖人有联系方式帖子详情页 数据获取顺序调整实现头像修改功能修改记录1.修改猫咪...

Global site tag (gtag.js) - Google Analytics