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接口的实例:
Stream<String> stream = Arrays.stream(new String[]{"Arrays", "stream"});List<String> collect = stream.collect(Collectors.toList());
关键词:
推荐阅读
雅虎在中国大陆停止产品与服务 雅虎是哪个国家的公司?
雅虎在中国大陆停止产品与服务根据中国雅虎官网, 2021年11月1日起的公告,中国大陆用户不能使用雅虎产品和服务,但不会影响雅虎在全球其 【详细】
电子设备包括哪些吗?电子设备发展史介绍
随着电子信息技术的不断发展,各种电子设备充斥在我们的生活中,我们的生活越来越离不开电子设备了。电子设备包括哪些吗?其实它主要包括电 【详细】
英吉利海峡的具体位置 英吉利海峡全长多少公里?
英吉利海峡的具体位置拉芒什海峡在英国和法国之间,属于英吉利海峡的一部分。是国际航运要道,西通大西洋,东北经多佛尔海峡连通北海,是一 【详细】
非洲大蜗牛介绍 为什么非洲大蜗牛会被列为“入侵物种”呢?
在我们的印象中,蜗牛都很小,没有争议。但有一种蜗牛,不仅有手掌大小,而且在很多国家和地区已经成功成为入侵物种,那么这种像手掌一样大 【详细】
天问一号拍摄到高清火星影像图 天问一号什么时候着陆火星?
天问一号拍摄到高清火星影像图今天(4日),国家航天局发布3幅由我国首次火星探测任务天问一号探测器拍摄的高清火星影像图,包括2幅黑白图像 【详细】
相关新闻
- Java核心技术知识点笔记—Java SE 8的流库(二) 全球热议
- 焦点信息:土卫六天然气储量丰富,是地球数百倍,要是不小心点燃了会怎样?
- “中国服装第一街”拒绝直播,润滑剂失灵,直播电商因何犯众怒?_观点
- 又一千元机登场!vivo Y78通过3C认证 支持44W快充
- 天天资讯:京医通宣布将停止预约挂号,数据隐私安全如何保障?
- 每日热议!面向中国市场 安波福推出全栈式软硬件解决方案
- 当前速递!“钢铁之花”绽放大国形象 话剧《多瑙河之波》在北京正式与观众见面
- 苹果升级 Apple Trade In 换购计划 天天速看料
- 今日热文:最新研究显示 ChatGPT 可分析美联储讲话,预测股票走势
- 量子营销:让产品与消费者互相真正地“看见”|每日播报
- 【独家】国内首款国潮电竞专业显卡发布,搭载“光谷造”GPU芯片
- 余承东回应王传福称自动驾驶是扯淡:不了解或是故意打击智驾行业-每日观察
- 人才培养布局深远,辛巴辛有志助力行业规范化发展
- 2023广东省考面试汕头考区交通指南
- 微软Azure OpenAI国际版发布行业场景 助力中国企业出海创新_全球最资讯
- 小熊电器预计一季度盈利增45%-65%_全球信息
- 全球焦点!长虹美菱一季度净利预增超19倍
- 海康威视一季度盈利下降20.69%
- 36.74米!白鹤滩水电站再创大坝岩芯世界新纪录
- 厚植博弈之论 筑梦创新管理