Functional Programming With Java 简明教程

Intermediate Methods

Java 8 中引入了流 API 以促进 Java 中的函数式编程。流 API 针对以函数式的方式处理对象集合。根据定义,流是 Java 组件,它可以对元素执行内部迭代。

流接口具有终结方法和非终结方法。非终结方法是会向流添加侦听器的那些操作。当流的终结方法被调用时,流元素的内部迭代开始,并且附加到流上的侦听器会针对每个元素被调用,结果由终结方法收集。

此类非终结方法称为中间方法。只有调用了终结方法,才能调用中间方法。以下是流接口的一些重要中间方法。

  1. filter − 根据给定条件从流中滤出不必要的元素。此方法接受谓词并在每个元素上应用它。如果谓词函数返回 true,则元素包含在返回的流中。

  2. map − 根据给定条件将流的每个元素映射至另一个项目。此方法接受函数并在每个元素上应用它。例如,将流中的每个 String 元素转换为大写 String 元素。

  3. flatMap − 此方法可用于根据给定条件将流的每个元素映射至多个项目。此方法在需要将复杂对象分解为简单对象时使用。例如,将句子列表转换为单词列表。

  4. distinct − 如果存在重复项,则返回唯一元素流。

  5. limit − 返回一个限制了元素的流,其中限制通过将一个数字传给 limit 方法进行限定。

Example - Intermediate Methods

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

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

      System.out.println("Example - Filter\n");
      //Filter strings whose length are greater than 3.
      Stream<String> longStrings = stringList
         .stream()
         .filter( s -> {return s.length() > 3; });

      //print strings
      longStrings.forEach(System.out::println);

      System.out.println("\nExample - Map\n");
      //map strings to UPPER case and print
      stringList
         .stream()
         .map( s -> s.toUpperCase())
         .forEach(System.out::println);

      List<String> sentenceList
         = Arrays.asList("I am Mahesh.", "I love Java 8 Streams.");

      System.out.println("\nExample - flatMap\n");
      //map strings to UPPER case and print
      sentenceList
         .stream()
         .flatMap( s -> { return  (Stream<String>)
            Arrays.asList(s.split(" ")).stream(); })
         .forEach(System.out::println);

      System.out.println("\nExample - distinct\n");
      //map strings to UPPER case and print
      stringList
         .stream()
         .distinct()
         .forEach(System.out::println);

      System.out.println("\nExample - limit\n");
      //map strings to UPPER case and print
      stringList
         .stream()
         .limit(2)
         .forEach(System.out::println);
   }
}

Output

Example - Filter

Three
Four
Five

Example - Map

ONE
TWO
THREE
FOUR
FIVE
ONE

Example - flatMap

I
am
Mahesh.
I
love
Java
8
Streams.

Example - distinct

One
Two
Three
Four
Five

Example - limit

One
Two