当前位置: 首页 > 知识库问答 >
问题:

Java8流映射ForEach Collect

冷正信
2023-03-14

我正在从文件中读取值并获取列表。如下-

List<String> fields = Utils.readFile("myText.txt", true);

一旦我得到这个列表

在Java7中实现非常容易,但是我无法在Java8中使用Stream Map/foreach Collect操作实现它。

我试过下面的方法-

Utils.readFile("myText-"+".txt", true)
        .stream()
        .map(str -> getListOfCustomObjForEachStr(str, pstmt))
        .collect(Collectors.toList());

但它返回一个List

getListOfCustomObjForEachStr()方法返回上述代码中传递的每个输入str的列表。我需要一个合并列表

有人能指导我在这里做些什么来获得合并列表吗?(我是新来的Java8,所以这可能看起来是一个愚蠢的问题,但任何帮助都很感激)

编辑1使用FlatMap像下面这样实现-如果有任何其他更好的方法,请提出建议。希望有一天它能帮助某个地方的人:)继续分享。

List<MyCustomObjects> = Utils.readFile("myText-"+".txt", true)
    .stream()
    .map(str -> getListOfCustomObjForEachStr(str, pstmt))
    .flatMap(Collection::stream)
    .collect(Collectors.toList());

共有1个答案

柯英奕
2023-03-14

使用flatMap是获取平面列表的标准方法。您可以使用单步而不是mapflatMap

List<MyCustomObjects> list = Utils.readFile("myText-"+".txt", true)
    .stream()
    .flatMap(str -> getListOfCustomObjForEachStr(str, pstmt).stream())
    .collect(Collectors.toList());

您可以考虑一种替代方法,以取代首先返回流的getListOfCustomObjForEachStr。此外,不存在文件。行,它返回一个行字符串流,而不首先填充临时的列表

在这种特殊情况下,有一种选择。考虑到。collect(Collectors.toList())相当于。collect(ArrayList::new,List::add,List::addAll)1,您还可以使用

List<MyCustomObjects> list = Utils.readFile("myText-"+".txt", true)
    .stream()
    .map(str -> getListOfCustomObjForEachStr(str, pstmt))
    .collect(ArrayList::new, List::addAll, List::addAll);

add替换为addAll,这已经足以添加所有子列表

这就是toList()现在的工作方式,但是因为它没有指定这样做,所以在其他版本中可能会有所不同

 类似资料:
  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 问题内容: 我对java8流中和方法之间的区别感到困惑。例如, 我得到空的输出在这里,但如果我改变地图就像 我可以得到 {1 = 1,2 = 2} 为什么只是没有运行方法?它们之间有什么区别? 问题答案: 什么都不做,因为在执行终端操作之前不会处理流管道。因此,残留物为空。 在流管道中添加终端操作将导致针对终端操作所需的每个元素执行操作(某些终端操作仅需要一个元素,而其他终端操作则需要的所有元素)

  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。

  • 我正在尝试使用流将一个列表映射到另一个列表。 原始列表的某些元素无法映射。也就是说,映射函数可能无法找到合适的新值。 null 对更好的方法的建议?或者我应该把溪流全部挖开,用好的旧循环?

  • 我需要将Java转换为的实例(包括映射内容) 我应该用什么来代替来使此代码可编译?