Java核心技术知识点笔记—Java SE 8的流库(二)

这篇具有很好参考价值的文章主要介绍了Java核心技术知识点笔记—Java SE 8的流库(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:约简是一种终结操作(terminal operation),它们会将流约简为可以在程序中使用的非流值。例如:Stream中的count方法,返回流中元素的数量。

1、简单约简举例:

(1)Optional<T> max(Comparator<? super T> comparator):使用给定的comparator规则,产生流的最大元素,如果流为空,则产生一个空的Optional对象。

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
Optional<String> optional = stream.max(String::compareToIgnoreCase);
System.out.print("max: " + optional.orElse(""));

(2)Optional<T> min(Comparator<? super T> comparator):使用给定的comparator规则,产生流的最小元素,如果流为空,则产生一个空的Optional对象。

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
Optional<String> optional = stream.min(String::compareToIgnoreCase);
System.out.print("min: " + optional.orElse(""));

(3)Optional<T> findFirst():产生流的第一个元素,如果流为空,则产生一个空的Optional对象。

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
Optional<String> optional = stream.filter(s->s.length()>5).findFirst();
System.out.print("findFirst: " + optional.orElse(""));

(4)Optional<T> findAny():产生流的任意一个元素,如果流为空,则产生一个空的Optional对象。

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
Optional<String> optional = stream.filter(s->s.length()>5).findAny();
System.out.print("findFirst: " + optional.orElse(""));

(5)boolean anyMatch(Predicate<? super T> predicate):判断流中是否有任意元素符合给定规则predicate,如果有返回true,如果没有返回false。

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
boolean anyMatch = stream.anyMatch(s -> s.length() > 5);
System.out.print("anyMatch: " + anyMatch);

(6)boolean allMatch(Predicate<? super T> predicate):判断流中元素是否全部符合给定规则predicate,如果全部符合返回true,否则返回false。

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
boolean allMatch = stream.allMatch(s -> s.length() > 51);
System.out.print("allMatch: " + allMatch);

(7)boolean noneMatch(Predicate<? super T> predicate):判断流中是否没有任何元素符合给定规则predicate,如果是返回true,否则返回false。

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
boolean noneMatch = stream.noneMatch(s -> s.length() > 51);
System.out.print("noneMatch: " + noneMatch);

2、Optional类型:Optional<T>对象是一种包装器对象,可以包装类型T的对象,或者没有包装任何对象。当包装了对象时,称之为值是存在的。Optional<T>类型被当作一种用来替代类型T的引用的更安全的方式,但是,只有在正确的情况下使用才能真正地更安全。

2.1、如何使用Optional值:有效使用Optional的关键在于:

(1)当值不存在时,会产生一个可替代物;

(2)只有当值存在时,才会使用这个值。

示例(1):通常,我们习惯在某个值不存在时使用默认值,或者进行某些默认的操作,比如对于某个可能存在可能不存在的字符串值:

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
//获取流中长度大于20的任意字符串,包装到一个Optional对象中
Optional<String> optional = stream.filter(s -> s.length() > 20).findAny();
//当值不存在时,使用空字符串作为默认值
String orElse = optional.orElse("");
//当值不存在时,通过调用其他代码产生一个默认值
optional.orElseGet(() -> {
    return "optional中没有值,通过调用其他代码来产生一个默认值";
});
//当值不存在时,抛出一个异常
optional.orElseThrow(IllegalAccessError::new);

示例(2):通常,当值存在的情况下才消费该值是比较合理的做法。在流中,使用ifPresent方法接受一个函数可以实现该目的:

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
//获取流中长度大于20的任意字符串,包装到一个Optional对象中
Optional<String> optional = stream.filter(s -> s.length() > 20).findAny();
//当值存在时,打印出字符串的长度,否则不执行任何操作
optional.ifPresent(s -> System.out.print("字符串" + s + "的长度为:" + s.length()));

ifPresent方法没有返回值,如果需要返回值,使用map方法:

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
//获取流中长度大于20的任意字符串,包装到一个Optional对象中
Optional<String> optional = stream.filter(s -> s.length() > 20).findAny();
//当值存在时,返回包装了字符串长度的Optional对象,否则返回一个没有包装任何值的Optional对象。
Optional<Integer> integer = optional.map(new Function<String, Integer>() {
    @Override
    public Integer apply(String s) {
        return s.length();
    }
});
System.out.print(integer.orElse(-1));

2.2、不适合使用Optional值的方式:

(1)get方法可以在Optional值存在的情况下获得其中包装的元素,但值不存下时,却会抛出一个NoSuchElementException异常。

(2)isPresent方法可以判断某个Optional<T>对象是否具有值,但诸如下列的操作:

if (optionalValue.isPresent()) {
    optionalValue.get().someMethod();
}

并不比下列方式更容易处理:

if (value!=null){
    value.someMethod();
}

2.3、创建Optional值:

(1)static <T> Optional<T> of(T value):产生一个给定值的Optional对象,如果给定值为null,将抛出一个NullPointerException异常。

(2)static <T> Optional<T> ofNullable(T value):产生一个给定值的Optional对象,如果给定值为null,则产生一个不包含值的Optional。

(3)static <T> Optional<T> empty():产生一个空的(不包含值)的Optional对象。

3、收集流的结果:

(1)forEach方法访问旧式风格的迭代器:

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
stream.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.print(s);
    }
});

(2)toArray方法接受一个数组构造器获得正确类型的数组:

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
String[] array = stream.toArray(String[]::new);

(3)collect方法接受一个Collector接口的实例:文章来源地址https://www.toymoban.com/news/detail-417302.html

Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});
List<String> collect = stream.collect(Collectors.toList());

到了这里,关于Java核心技术知识点笔记—Java SE 8的流库(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链学习笔记(6(1),深入理解Linux运维的核心知识点

    (3)检查创世块文件 (4)  检查通道文件(fabric2.2及以前会用到) 创建节点的方式有两种: (1)在创建任何节点之前,必须在本机上自定义其配置文件。对于peer节点,该文件称为 core.yaml ,而orderer节点的配置文件称为 orderer.yaml; (2)使用一个docker容器,将docker节点跑在一个

    2024年04月29日
    浏览(39)
  • Java核心知识点1-java和c++区别、隐式和显示类型转换

    java和c++区别 java通过虚拟机实现跨平台特性,但c++依赖于特定的平台。 java没有指针,它的引用可以理解为安全指针,而c++和c一样具有指针。 java支持自动垃圾回收,而c++需要手动回收。 java不支持多重继承,只能通过实现多个接口来达到相同目的,而c++支持多继承。  隐式(

    2024年02月03日
    浏览(34)
  • Java笔记(细碎小知识点)1

    1.Dos命令:dir:打出当前目录结构;md:创建文件夹;cd+文件夹地址:跳转到当前目录下的对应文件夹;cd..:跳转到上一目录;rd+文件夹:删除文件夹中东西;del+文件(或 “*.文件” 类型这样的正则表达式):删除文件或这类文件;cd/:跳转到盘符;javac+文件名.java:编译

    2024年02月08日
    浏览(29)
  • JAVA知识点笔记—— 开源框架篇

    1、MyBatis 的优点? 1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响, SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并可重用。 2、与 JDBC 相比,减少了 50%以上的代码量,消除了 JDB

    2024年02月07日
    浏览(26)
  • 《模拟电子技术》期末复习笔记4——上交大郑益慧课件知识点整理

    笔记整理自B站学习教程 《 模拟电子技术基础 上交大 郑益慧主讲 》 1904年,世界上第一只真空电子二极管在英国物理学家弗莱明的手下诞生,电子技术的时代开始了。为了提高性能, 1906年,美国发明家德福雷斯特做出了第一个三极管,这是电子技术工业革命开始的标志。从

    2024年02月02日
    浏览(67)
  • PyFlink核心知识点

    四层 说明 备注 SteamGraph 代码生成的最初的图 表示程序的拓扑结构 JobGraph 将多个符合条件的节点,链接为一个节点 可以减少数据在节点之间流动所需要的序列化/反序列化/传输消耗 ExecutionGraph JobGraph的并行化版本 是调度层最核心的数据结构 PhysicalGraph JobManager根据ExecutionGra

    2024年04月27日
    浏览(42)
  • Vue入门——核心知识点

    Vue是一套用于 构建用户界面 的 渐进式 JS框架。 构建用户界面:就是将后端返回来的数据以不同的形式(例如:列表、按钮等)显示在界面上。 渐进式:就是可以按需加载各种库。简单的应用只需要一个核心库即可,复杂的应用可以按照需求引入各种Vue插件。 采用组件化模式

    2024年02月06日
    浏览(40)
  • 垃圾回收的核心知识点解析

    Java运行时内存中的程序计数器、虚拟机栈、本地方法栈这三部分区域其生命周期与相关线程有关,随线程而生,随线程而灭。而程序计数器就是一个单纯存地址的整数也不需要关心,因此我们GC(垃圾回收)的主要目标就是堆(堆中存放着几乎所有实例对象)! 一个对象,如

    2024年02月16日
    浏览(31)
  • JavaSE核心基础-循环-知识点

    1.循环概念 循环是在满足条件的情况下,反复的做同一件事。 Java语言中的循环语句有三种,分别是for语句、while语句和do-while语句。程序中需要循环处理时,程序员要根据实际问题,选择适当的循环语句。解决循环问题时一定要找到循环条件和循环操作。 2.for循环语句格式

    2024年02月22日
    浏览(30)
  • 一文吃透Tomcat核心知识点

    首先,看一下整个架构图。最全面的Java面试网站 接下来简单解释一下。 Server :服务器。Tomcat 就是一个 Server 服务器。 Service :在服务器中可以有多个 Service,只不过在我们常用的这套 Catalina 容器的Tomcat 中只包含一个 Service,在 Service 中包含连接器和容器。一个完整的 Serv

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包