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

map()的语法表示为:

<R> Stream<R> map(Function<? super T, ? extends R> mapper)

flatMap()的语法表示为:

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)

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

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

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

flatMap()可以用在必须对字符串进行扁平化或转换的地方,因为不能用map()来扁平化字符串。

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

map()和flatmap()的区别

map() flatMap()
传递给map()操作的函数对单一输入返回一个单一的值。 传给flatmap()操作的函数返回任意数量的值作为输出。
一对一映射发生在map()中。 一对多的映射发生在flatMap()中。
只执行映射。 执行映射以及扁平化。
生成一个值流。 生成一个流值的流。
map()只用于转换。 flatMap()同时用于转换和映射。

以下是使用map()函数的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 YiibaiDemo {

    public static void main(String[] args)
    {
        // making the array list object
        ArrayList<String> 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);
    }
}

运行结果:

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

下面是使用flatMap()的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 YiibaiDemo {
    public static void main(String[] args)
    {
        // making the arraylist object of List of Integer
        List<List<Integer> > 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<Integer> 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]

Java流中map()和flatMap()的区别

欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:Java流中map()和flatMap()的区别
本文链接:https://www.vsdiffer.com/vs/difference-between-map-and-flatmap-in-java-stream.html
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。