Functional Programming With Java 简明教程
Intermediate Methods
Java 8 中引入了流 API 以促进 Java 中的函数式编程。流 API 针对以函数式的方式处理对象集合。根据定义,流是 Java 组件,它可以对元素执行内部迭代。
流接口具有终结方法和非终结方法。非终结方法是会向流添加侦听器的那些操作。当流的终结方法被调用时,流元素的内部迭代开始,并且附加到流上的侦听器会针对每个元素被调用,结果由终结方法收集。
此类非终结方法称为中间方法。只有调用了终结方法,才能调用中间方法。以下是流接口的一些重要中间方法。
-
filter − 根据给定条件从流中滤出不必要的元素。此方法接受谓词并在每个元素上应用它。如果谓词函数返回 true,则元素包含在返回的流中。
-
map − 根据给定条件将流的每个元素映射至另一个项目。此方法接受函数并在每个元素上应用它。例如,将流中的每个 String 元素转换为大写 String 元素。
-
flatMap − 此方法可用于根据给定条件将流的每个元素映射至多个项目。此方法在需要将复杂对象分解为简单对象时使用。例如,将句子列表转换为单词列表。
-
distinct − 如果存在重复项,则返回唯一元素流。
-
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);
}
}