1.检查

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

该类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);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).anyMatch(x -> x > 0);

false

在最后一个示例中,我们首先只保留小于零的元素,然后检查结果以查看是否有任何过滤元素大于零。当然,这样的元素已经不存在了。

布尔 allMatch(rule) 方法

此方法检查流中的所有元素是否都匹配规则(也称为谓词)。规则作为参数传递给方法:

代码 笔记
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
(我们保留了小于零的元素)

在最后一个例子中,我们首先只允许小于零的元素通过过滤器,然后我们检查是否所有保留的元素都小于零。检查产生了积极的结果。

boolean noneMatch(rule) 方法

noneMatch()方法检查流是否没有与传递的规则匹配的元素。这就像方法的反面anyMatch()

代码 笔记
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);

true

4
任务
Java 核心,  第 6 级课程 5
已锁定
加入:在正确的时间、正确的位置
想想你在哪里和在什么对象上需要调用 join 方法 来首先显示 firstThread 的结果,然后显示 secondThread 的结果。 在正确的位置调用 join 方法。 示例输出: firstThread :String 1 firstThread :String 2 ... firstThread :String 19 firstThread :String 20 secondThread :String 1 ... secondThread :String 20
18
任务
Java 核心,  第 6 级课程 5
已锁定
赛马
弄明白程序的功能。 实现 calculateHorsesFinished 方法。 必须: 1.计算并返回已经赛完的马的数量。使用 isFinished() 方法。 2.如果马尚未越过终点线 (!IsFinished()),则: 2.1.显示“正在等待 ”+ horse.getName()。 2.2.等待,直到它完成比赛。想想你需要使用什么方法来执行此操作。 2.3.不将这种马视作完成比赛。

2.实用类:Optionalclass

有时程序员使用null引用是很不方便的。例如,假设您正在比较两个字符串。如果两个变量都不是null,那么您只需调用s1.equals(s2),一切都会正常进行。但如果s1可能null,那么您必须编写处理这种情况的代码以避免NullPointerException.

这就是程序员想出Optional<T>实用程序类的原因。它的代码大概是这样的:

代码 笔记
class Optional<Type>
{
   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,则返回作为方法参数传入的值



返回存储的非空值,或者如果值为空则抛出异常。

这个类的目的只是为了存储一个 T 对象(对类型为 T 的对象的引用)。对象内部的对象引用Optional<T>可以是null.

这个类可以让程序员编写更漂亮的代码。让我们比较一下:

使用可选 不使用可选
public void printString(String s)
{
   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)
}

始终可以使用该方法将一个Optional对象与另一个对象进行比较,即使它们存储引用也是如此。Optionalequalsnull

简单地说,该类允许您在对象存储值的情况下Optional编写“漂亮”的检查和“漂亮”的操作。nullOptionalnull


9
任务
Java 核心,  第 6 级课程 5
已锁定
政治辩论中的学问
1.弄明白程序的功能。 2.我们需要在政治辩论中确保笨蛋发言次数最多。 3.想想你可以在 chump 对象上调用什么方法来确保笨蛋在所有可用的时间都在发言。

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();
4
任务
Java 核心,  第 6 级课程 5
已锁定
公平
1.弄明白程序的功能。 2.确保所有老鼠最好能同时吃东西! 3.想想哪个方法可让 alpha 雄性老鼠先吃,其他老鼠为何等待。 4.移除此方法调用。
9
任务
Java 核心,  第 6 级课程 5
已锁定
安排 join() 调用
1.弄明白程序的功能。 2.安排 join() 调用,让每个猫都执行下面的操作: 2.1.首先,猫生出小猫。 2.2.然后,所有小猫都随机爬出篮子。 2.3.最后,猫将这些小猫放回篮子。 2.4.一只猫的这些活动可能与另一只猫的活动穿插在一起。 2.5.将小猫午睡时间(sleep 200 毫秒)添加到 investigateWorld。