filter()和map()是Java 8中Stream接口提供的两个常用中间操作方法,它们在功能上有所区别。
- filter()方法:
filter()方法用于根据指定的条件筛选流中的元素,只保留符合条件的元素。它接受一个Predicate函数式接口作为参数,该接口定义了用于判断元素是否满足条件的方法。
以下是filter()方法的定义:
Stream<T> filter(Predicate<? super T> predicate)
使用filter()方法可以对流中的元素进行条件过滤,只保留满足条件的元素,并返回一个新的Stream对象。
例如,我们可以使用filter()方法从一个整数列表中筛选出所有的偶数:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> evenNumbers = numbers.stream()
.filter(num -> num % 2 == 0);
evenNumbers.forEach(System.out::println);
在上述代码中,我们创建了一个整数列表 numbers。通过调用stream()方法将其转换为流,在流中使用filter()方法指定了一个条件num % 2 == 0,即筛选出所有的偶数。
最后,我们使用forEach()方法对筛选后的流中的每个元素进行打印输出。
- map()方法:
map()方法用于对流中的每个元素执行一个映射操作,将每个元素根据指定的映射规则转换为另一种类型。它接受一个Function函数式接口作为参数,该接口定义了将元素转换为另一种类型的方法。
以下是map()方法的定义:
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
使用map()方法可以对流中的元素进行转换,并返回一个新的Stream对象。
例如,我们可以使用map()方法将一个字符串列表中的所有字符串转换为大写形式:
List<String> strings = Arrays.asList("apple", "banana", "orange");
Stream<String> uppercaseStrings = strings.stream()
.map(String::toUpperCase);
uppercaseStrings.forEach(System.out::println);
在上述代码中,我们创建了一个字符串列表 strings。通过调用stream()方法将其转换为流,在流中使用map()方法将每个字符串转换为大写形式。
最后,我们使用forEach()方法对转换后的流中的每个元素进行打印输出。
总结:
filter()方法用于根据条件过滤流中的元素;
map()方法用于对流中的每个元素执行转换操作。
根据具体的需求,选择使用filter()方法还是map()方法。如果你想筛选满足特定条件的元素,使用filter();如果你想对元素进行转换,使用map()。