添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我认为您可能已经厌倦了学习如何将数据流链接在一起。您想最终对数据做些什么。

该类 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 语言开发人员职业方面的内容。