我认为您可能已经厌倦了学习如何将数据流链接在一起。您想最终对数据做些什么。
该类
Stream
具有三个标准方法,它们不构造流,而是检查其中的数据类型。这些方法是:
anyMatch()
、
allMatch()
和
noneMatch()
。
boolean anyMatch(rule)
方法
此方法检查流是否至少有一个元素满足传递给该方法的规则。如果存在这样的元素,则该方法返回
true
,否则返回
false
。
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.anyMatch(x -> x > 0);
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.anyMatch(x -> x > 0);
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).anyMatch(x -> x > 0);
false
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.allMatch(x -> x > 0);
true
(所有大于零的元素)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.allMatch(x -> x > 0);
false
(是否有小于或等于零的元素?)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).allMatch(x -> x < 0);
true
(我们保留了小于零的元素)
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.noneMatch(x -> x > 0);
false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.noneMatch(x -> x > 0);
false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).noneMatch(x -> x > 0);
2.实用类:
Optional
class
有时程序员使用
null
引用是很不方便的。例如,假设您正在比较两个字符串。如果两个变量都不是
null
,那么您只需调用
s1.equals(s2)
,一切都会正常进行。但如果
s1
可能
null
,那么您必须编写处理这种情况的代码以避免
NullPointerException
.
这就是程序员想出
Optional<T>
实用程序类的原因。它的代码大概是这样的:
private final
Type
value
;
private
Optional
() { this.
value
= null;}
private
Optional
(value) { this.
value
=
value
;}
public static <
Type
>
Optional
<
Type
> of(
Type
value
)
return new
Optional
<
Type
>(
value
);
public boolean
isPresent
()
return
value
!= null;
public boolean
isEmpty
()
return
value
== null;
public
Type
get
()
if (
value
== null)
throw new NoSuchElementException();
return
value
;
public
Type
orElse
(
Type
other
)
return
value
!= null ?
value
:
other
;
public
Type
orElseThrow
()
if (
value
== null)
throw new NoSuchElementException();
return
value
;
检查值是否不是
null
检查值是否是
null
返回存储的值。如果值为 null,则抛出异常。
返回存储的非空值。或者,如果存储的值为
null
,则返回作为方法参数传入的值
返回存储的非空值,或者如果值为空则抛出异常。
Optional
<
String
>
str
=
Optional
.
ofNullable
(s);
System.out.println(
str
.
orElse
(""));
public void printString(String s)
String str = s != null ? s : "";
System.out.println(str)
3.寻找元素
让我们回到Stream
课堂上。该类Stream
还有 4 个方法可以让您在流中搜索元素。这些方法是findFirst()
、findAny()
、min()
和max()
。
Optional<T> findFirst()
方法
该findFirst()
方法只返回流中的第一个元素。这就是它所做的一切。
这里需要注意的更有趣的事情是该方法不返回对象T
,而是一个Optional<T>
包装器对象。这确保该方法null
在找不到对象后永远不会返回。
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello
为了更清楚地说明,让我们将最后一行分成几行:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello
最后一个get()
方法只是检索存储在对象中的值Optional
。
Optional<T> findAny()
方法
该findAny()
方法返回流中的任何元素并在那里结束。此方法类似于findFirst()
,但它非常适用于并行操作中使用的流。
并行处理流时,可能在流的某个部分已经找到了一个元素,但尚不清楚它是否是第一个。
如果许多元素都匹配了所有过滤器,并且程序员准确地获取其中的第一个元素很重要,那么findFirst()
应该调用该方法。如果程序员知道实际上 0 或 1 个元素将匹配所有过滤器,那么只需调用就足够了findAny()
——这样会更快。
Optional<T> min(Comparator<T>)
方法
该min()
方法使用一个comparator
对象来比较流中的所有元素并返回最小的元素。定义比较器对象最方便的方法是使用 lambda 函数。
搜索最短字符串的示例:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();
Optional<T> max(Comparator<T>)
方法
该max()
方法使用一个comparator
对象来比较流中的所有元素并返回最大元素。定义比较器对象最方便的方法是使用 lambda 函数。
搜索最长字符串的示例:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
CodeGym 是一个从零开始学习 Java 语言编程的在线课程。本课程是初学者掌握 Java 语言的绝佳方式。它包含 1200 多个可即时验证的任务,以及基本范围内的 Java 基础理论。为了帮助你在教育上取得成功,我们实现了一组激励功能:小测验、编码项目以及有关高效学习和 Java 语言开发人员职业方面的内容。