📜  Java Stream 中 map() 和 flatMap() 的区别

📅  最后修改于: 2021-09-12 11:24:03             🧑  作者: Mango

在Java,Stream 接口具有 map() 和 flatmap() 方法都具有中间流操作并返回另一个流作为方法输出。函数 map() 和 flatMap 都用于转换和映射操作。 map()函数为一个输入值生成一个输出,而 flatMap()函数为每个输入值生成任意数量的值作为输出(即零或大于零)。

map() 的语法表示为:

 Stream map(Function mapper)

flatMap() 的语法表示为:-

 Stream flatMap(Function> mapper)

其中 R 是新流的元素类型。流是一个接口,T 是流元素的类型,映射器是一个无状态函数,应用于每个元素,该函数返回新的流。

map()可以用于我们必须将特定集合的元素映射到某个函数,然后我们需要返回包含更新结果的流。

示例:将列表中的所有元素乘以 3 并返回更新后的列表。

flatMap()可用于我们必须展平或转换字符串,因为我们无法使用 map() 展平我们的字符串。

示例:获取字符串列表中所有字符串的第一个字符,并以流的形式返回结果。

map() 和 flatmap() 的区别

                                        map()                                            flatMap()
The function passed to map() operation returns a single value for a single input. The function you pass to flatmap() operation returns an arbitrary number of values as the output.
One-to-one mapping occurs in map(). One too many mapping occurs in flatMap().
Only perform the mapping. Perform mapping as well as flattening.
Produce a stream of value. Produce a stream of stream value.
map() is used only for transformation. flatMap() is used both for transformation and mapping.

以下是使用 map()函数的Java程序:

Java
// Java program using map() function
import java.io.*;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class GFG {
    
    public static void main(String[] args)
    {
        // making the array list object
        ArrayList fruit = new ArrayList<>();
        fruit.add("Apple");
        fruit.add("mango");
        fruit.add("pineapple");
        fruit.add("kiwi");
        System.out.println("List of fruit-" + fruit);
        
        // lets use map() to convert list of fruit
        List list = fruit.stream()
                        .map(s -> s.length())
                        .collect(Collectors.toList());
        System.out.println("List generated by map-" + list);
    }
}


Java
// Java program using flatMap() function
import java.io.*;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class GFG {
    public static void main(String[] args)
    {
        // making the arraylist object of List of Integer
        List > number = new ArrayList<>();
        
        // adding the elements to number arraylist
        number.add(Arrays.asList(1, 2));
        number.add(Arrays.asList(3, 4));
        number.add(Arrays.asList(5, 6));
        number.add(Arrays.asList(7, 8));
        
        System.out.println("List of list-" + number);
        
        // using flatmap() to flatten this list
        List flatList
            = number.stream()
                  .flatMap(list -> list.stream())
                  .collect(Collectors.toList());
        
        // printing the list
        System.out.println("List generate by flatMap-"
                           + flatList);
    }
}


输出:

List of fruit-[Apple, mango, pineapple, kiwi]
List generated by map-[5, 5, 9, 4]

下面是使用 flatMap() 的Java程序:

Java

// Java program using flatMap() function
import java.io.*;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class GFG {
    public static void main(String[] args)
    {
        // making the arraylist object of List of Integer
        List > number = new ArrayList<>();
        
        // adding the elements to number arraylist
        number.add(Arrays.asList(1, 2));
        number.add(Arrays.asList(3, 4));
        number.add(Arrays.asList(5, 6));
        number.add(Arrays.asList(7, 8));
        
        System.out.println("List of list-" + number);
        
        // using flatmap() to flatten this list
        List flatList
            = number.stream()
                  .flatMap(list -> list.stream())
                  .collect(Collectors.toList());
        
        // printing the list
        System.out.println("List generate by flatMap-"
                           + flatList);
    }
}
输出
List of list-[[1, 2], [3, 4], [5, 6], [7, 8]]
List generate by flatMap-[1, 2, 3, 4, 5, 6, 7, 8]