Functional Programming With Java 简明教程

Functional Programming - Terminal Methods

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

When a terminal method in invoked on a stream, iteration starts on stream and any other chained stream. Once the iteration is over then the result of terminal method is returned. A terminal method does not return a Stream thus once a terminal method is invoked over a stream then its chaining of non-terminal methods or intermediate methods stops/terminates.

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

Generally, terminal methods returns a single value and are invoked on each element of the stream. Following are some of the important terminal methods of Stream interface. Each terminal function takes a predicate function, initiates the iterations of elements, apply the predicate on each element.

  1. anyMatch − If predicate returns true for any of the element, it returns true. If no element matches, false is returned.

  2. allMatch − If predicate returns false for any of the element, it returns false. If all element matches, true is returned.

  3. noneMatch − If no element matches, true is returned otherwise false is returned.

  4. collect − each element is stored into the collection passed.

  5. count − returns count of elements passed through intermediate methods.

  6. findAny − returns Optional instance containing any element or empty instance is returned.

  7. findFirst − returns first element under Optional instance. For empty stream, empty instance is returned.

  8. forEach − apply the consumer function on each element. Used to print all elements of a stream.

  9. min − returns the smallest element of the stream. Compares elements based on comparator predicate passed.

  10. max − returns the largest element of the stream. Compares elements based on comparator predicate passed.

  11. reduce − reduces all elements to a single element using the predicate passed.

  12. toArray − returns arrays of elements of stream.

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