Functional Programming With Java 简明教程

Functional Programming - Terminal Methods

当在流上调用终结方法时,对流和任何其他链接流启动迭代。迭代结束后,会返回终结方法的结果。终结方法不返回 Stream,因此一旦在流上调用终结方法,那么其对非终结方法或中间方法的链接就会停止/终止。

通常,终结方法返回一个值并针对流中的每个元素调用它们。以下是流接口的一些重要终结方法。每个终结函数都会获取一个谓词函数,启动元素的迭代,在每个元素上应用谓词。

  1. anyMatch − 如果谓词对任意元素返回 true,则返回 true。如果没有元素匹配,则返回 false。

  2. allMatch − 如果谓词对任意元素返回 false,则返回 false。如果所有元素都匹配,则返回 true。

  3. noneMatch − 如果没有元素匹配,则返回 true,否则返回 false。

  4. collect − 将每个元素存储到传递的集合中。

  5. count − 返回通过中间方法传递的元素数量。

  6. findAny − 返回包含任意元素的 Optional 实例或返回空实例。

  7. findFirst − 返回 Optional 实例中的第一个元素。对于空流,返回空实例。

  8. forEach − 在每个元素上应用使用者函数。用于打印流的所有元素。

  9. min − 返回流中最小的元素。根据通过的比较器谓词比较元素。

  10. max − 返回流中最大的元素。根据通过的比较器谓词比较元素。

  11. reduce − 使用通过的谓词将所有元素简化为单个元素。

  12. toArray − 返回流中元素的数组。

Example - Terminal Methods

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FunctionTester {
   public static void main(String[] args) {
      List<String> stringList
         = Arrays.asList("One", "Two", "Three", "Four", "Five", "One");

      System.out.println("Example - anyMatch\n");
      //anyMatch - check if Two is present?
      System.out.println("Two is present: "
         + stringList
         .stream()
         .anyMatch(s -> {return s.contains("Two");}));

      System.out.println("\nExample - allMatch\n");
      //allMatch - check if length of each string is greater than 2.
      System.out.println("Length > 2: "
         + stringList
         .stream()
         .allMatch(s -> {return s.length() > 2;}));

      System.out.println("\nExample - noneMatch\n");
      //noneMatch - check if length of each string is greater than 6.
      System.out.println("Length > 6: "
         + stringList
         .stream()
         .noneMatch(s -> {return s.length() > 6;}));

      System.out.println("\nExample - collect\n");
      System.out.println("List: "
         + stringList
         .stream()
         .filter(s -> {return s.length() > 3;})
         .collect(Collectors.toList()));

      System.out.println("\nExample - count\n");
      System.out.println("Count: "
         + stringList
         .stream()
         .filter(s -> {return s.length() > 3;})
         .count());

      System.out.println("\nExample - findAny\n");
      System.out.println("findAny: "
         + stringList
         .stream()
         .findAny().get());

      System.out.println("\nExample - findFirst\n");
      System.out.println("findFirst: "
         + stringList
         .stream()
         .findFirst().get());

      System.out.println("\nExample - forEach\n");
      stringList
         .stream()
         .forEach(System.out::println);

      System.out.println("\nExample - min\n");
      System.out.println("min: "
         + stringList
         .stream()
         .min((s1, s2) -> { return s1.compareTo(s2);}));

      System.out.println("\nExample - max\n");
      System.out.println("min: "
         + stringList
         .stream()
         .max((s1, s2) -> { return s1.compareTo(s2);}));

      System.out.println("\nExample - reduce\n");
      System.out.println("reduced: "
         + stringList
         .stream()
         .reduce((s1, s2) -> { return s1 + ", "+ s2;})
         .get());
   }
}

Output

Example - anyMatch

Two is present: true

Example - allMatch

Length > 2: true

Example - noneMatch

Length > 6: true

Example - collect

List: [Three, Four, Five]

Example - count

Count: 3

Example - findAny

findAny: One

Example - findFirst

findFirst: One

Example - forEach

One
Two
Three
Four
Five
One

Example - min

min: Optional[Five]

Example - max

min: Optional[Two]

Example - reduce

reduced: One, Two, Three, Four, Five, One