Java 8映射,过滤和收集示例


写一篇有关Java 8的地图和过滤器功能的文章,因为他们发现它们难以使用和理解。即使我之前已经写过有关map()和filter()的博客,但我还是在 再次写信以扩展外行语言的概念,以便为每个人提供更好的理解。

的地图()函数是在表示功能的编程概念Stream类的方法。简而言之,map()用于通过应用function将一个对象转换为另一个对象。

这就是Stream.map(Function mapper)将函数作为参数的原因。例如,通过使用map()函数,可以通过将Integer.valueOf()方法应用于输入列表中的每个String,将String列表转换为Integer 列表。

您只需要一个映射功能即可将一个对象转换为另一个对象。然后,map()函数将为您进行转换。它也是Stream的中间操作,这意味着您可以调用其他Stream方法,例如过滤器,或在此方法上收集以创建转换链。

该 过滤器的方法,顾名思义, 过滤器基于条件的元素,你给了它。例如,如果您的列表包含数字,而您只想要数字,则可以使用过滤器方法选择一个只能被二整除的数字。

过滤方法实质上是根据您提供的条件选择元素。这就是为什么过滤器(谓词条件)接受谓词对象的原因,该对象提供了应用于条件的功能。如果条件评估为真,则选择对象。否则,它将被忽略。

与map相似,过滤器也是一个中间操作,这意味着您可以在调用过滤器后调用其他Stream方法。

filter()方法也是惰性的,这意味着直到调用减少方法(如collect)之前,它都不会被求值,并且一旦到达目标,它就会停止。如果您不熟悉Stream行为,建议您查看 Ultimate Java 8 Tutorial,它进一步详细地介绍了Stream的基础知识。

1.如何在Java 8中使用地图和过滤器

您需要一个很好的例子来理解任何新概念。由于String和Integer是Java中最常见的数据类型,因此我选择了一个既简单又有趣的示例。

我有一个字符串列表:数字,例如{“ 1”,“ 2”,“ 3”,“ 4”,“ 5”,“ 6”}。我要处理此列表,并需要另一个仅包含偶数的整数列表。

为了找到偶数,我首先需要将String列表转换为Integer列表。为此,我可以使用java.util.Stream类的map()方法。但是,在此之前,我们需要一个Stream作为java.util.stream类中定义的map()。

这一点都不困难,因为您可以通过调用在java.util.Collection接口中定义的stream()方法从任何集合(例如List或Set)中获取流。

map(Function mapper)方法采用Function,从技术上来说,是java.util.function.Function接口的对象。然后将此函数应用于Stream的每个元素,以将其转换为所需的类型。

因为我们需要将String转换为Integer,所以我们可以将Integer.parseInt()或Integer.valueOf()方法传递给map()函数。

由于性能和缓存,我选择了valueOf()方法。(顺便说一句,不仅是我。甚至Joshua Bloch都建议使用诸如ValueOf()之类的静态工厂方法,而不是Effective Java中的构造方法。)

图片标题

然后map()将返回一个包含偶数和奇数的整数流。要只选择偶数,我们可以使用filter()方法。

它使用谓词对象,从技术上讲,它是将对象转换为boolean的函数。我们传递一个对象,它将返回true或false。然后,过滤器使用该信息将对象包括在结果流中。

要仅包含偶数,我们将其称为filter(number-> number%2 == 0),这意味着每个数字将被二除,如果没有余数,则将其选中。这与我们解决编码问题时使用的逻辑相同,以检查给定数字在Java中是偶数还是奇数。

我们快完成了。但是,到目前为止,我们只有偶数整数流-甚至没有偶数列表,这就是为什么我们需要使用它们。

由于我们需要一个列表,因此我调用了collect(Collectors.toList()),它将所有偶数累加到一个列表中并返回。

现在,您可能在想:如何知道返回整数列表?好吧,我们需要通过类型推断来获取该信息,因为我们已经通过将结果存储到List 中来指定了该信息。

如果您想进一步了解lambda表达式中的类型推断,那么Complete Java MasterClass是一个不错的起点。

  1. Java 8 Map +过滤+收集示例

2.png

2. Java 8 Map +过滤+收集示例

这是实现上面部分中介绍的Java程序。您可以在IDE中或从命令行运行此程序,然后查看结果。

您也可以尝试使用更多的map()函数或更多的filter()调用来使合成更长,更复杂。您甚至可以使用collect()方法将结果收集到list,set,map或任何其他集合中。

package tool;

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

/**
 * 
 * A simple Java Program to demonstrate how to use map and filter method Java 8.
 * In this program, we'll convert a list of String into a list of Integer and
 * then filter all even numbers.
 */
public class Hello {

  public static void main(String[] args) {

    List<String> numbers = Arrays.asList("1", "2", "3", "4", "5", "6");
    System.out.println("original list: " + numbers);

    List<Integer> even = numbers.stream()
                                .map(s -> Integer.valueOf(s))
                                .filter(number -> number % 2 == 0)
                                .collect(Collectors.toList());

    System.out.println("processed list, only even numbers: " + even);

  }

}

Output
original list: [1, 2, 3, 4, 5, 6]
the processed list, only even numbers: [2, 4, 6]

您可以看到原始列表包含从1到6的数字,而过滤后的列表仅包含偶数,即2、4和6。

此示例中最重要的代码是以下四行Stream处理代码:

2.png

这段代码从地图开始,然后是过滤器,最后是收集。您可能想知道订单是否重要。好吧,确实如此。

由于我们的过滤条件需要一个int变量,因此我们首先需要将String Stream转换为Stream of Integer。这就是为什么我们首先调用map()函数的原因。

一旦有了整数流,就可以应用数学运算来找到偶数。我们将该条件传递给了filter方法。如果我们需要对String进行过滤,例如选择所有长度大于2的字符串,那么我们将在map之前调用filter。

这就是如何在Java 8中使用映射和过滤器的全部内容。我们已经看到了一个有趣的示例,说明如何使用地图将对象转换为另一个对象,以及如何使用过滤器根据条件选择对象。我们还学习了如何在流上编写操作,以编写清晰明了的代码。


原文链接:https://blog.csdn.net/Beibnjin/article/details/113827586?utm_medium=distribute.pc_category.none-task-blog-hot-1.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-1.nonecase&request_id=