java中map是把集合每个元素重新映射,元素个数不变,但是元素值发生了变化。而flatMap从字面上来说是压平这个映射,实际作用就是将每个元素进行一个一对多的拆分,细分成更小的单元,返回一个新的Stream流,新的流元素个数增加。
java中map是把集合每个元素重新映射,元素个数不变,但是元素值发生了变化。而flatMap从字面上来说是压平这个映射,实际作用就是将每个元素进行一个一对多的拆分,细分成更小的单元,返回一个新的Stream流,新的流元素个数增加。
java官方给出的示例如下:
# 按行读取文件内容Stream lines = Files.lines(path);# 将每一行文字按照空格拆分为单词Stream words = lines.flatMap(line -> Stream.of(line.split(" +")));
如下所示的文本:
hello worldthis is a test txtdone
经过这个转换,得到的结果如下:
[hello, world, this, is, a, test, txt, done]
我们大概知道,flatMap压平的作用,就是把原来的三行字符串文字变为了一个流,流数组中每个元素是单词。
============
我们假设有这样的需求,有一个[[1,3],[2,4]]的二维数组,我们要得到一个一维数组[1,3,2,4]。那么这里的flatMap就正好排上用场,原来是二维的,现在压平为一维,正好分解了。
List lista = new ArrayList<>();lista.add(1);lista.add(3);List listb = new ArrayList<>();listb.add(2);listb.add(4);List> listc = new ArrayList<>();listc.add(lista);listc.add(listb);System.out.println(listc);List listd = listc.stream().flatMap(ele -> ele.stream()).collect(Collectors.toList());System.out.println(listd);
运行程序打印信息如下:
[[1, 3], [2, 4]][1, 3, 2, 4]
flatMap里面需要传入一个Function参数,这里根据需要将数组转为stream。其实可以直接传入一个函数名:Collection::stream,效果是一样的。
完整代码如下:
package org.example;import java.io.IOException;import java.NIO.file.Files;import java.nio.file.Paths;import java.util.ArrayList;import java.util.Collection;import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream;public class FlatMapExample { public static void main(String[] args) { List lista = new ArrayList<>(); lista.add(1); lista.add(3); List listb = new ArrayList<>(); listb.add(2); listb.add(4); List> listc = new ArrayList<>(); listc.add(lista); listc.add(listb); System.out.println(listc); List listd = listc.stream().flatMap(Collection::stream).collect(Collectors.toList()); System.out.println(listd); try { Stream stream = Files.lines(Paths.get("test.txt")); // stream.forEach(System.out::println); List words = stream.flatMap(line -> Stream.of(line.split(" +"))).collect(Collectors.toList()); System.out.println(Words); } catch (IOException e) { throw new RuntimeException(e); } }}
运行截图:
Stream对象经过一次操作之后,内容就会被清除,同时流也被关闭。如果还进行第二次其他操作,那么就会报错:
stream has already been operated upon or closed
所以进行流操作,一般都是把所有的流程都以链式写法写在一起,最后得到结果。
来源地址:https://blog.csdn.net/feinifi/article/details/128980814
--结束END--
本文标题: java中flatMap用法
本文链接: https://www.lsjlt.com/news/393412.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0