gpt4 book ai didi

Java 8 流 + 映射 + ForEach + 收集

转载 作者:行者123 更新时间:2023-12-02 11:59:17 27 4
gpt4 key购买 nike

我正在从文件中读取值并获取列表。就像下面一样 -

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

一旦我得到这个List<String>我想迭代这个列表并将每个值传递给使用该值的函数,查询数据库并准备 List<MyCustomObject>并返回相同的值。

在 Java 7 中实现非常简单,但我无法使用 Stream + Map/forEach + Collect 操作在 Java 8 中实现它。

我尝试过以下方法 -

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

但它返回 List<List<MyCustomObject>>而不是合并List<MyCustomObject>

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

有人可以指导我在这里可以做什么来获取合并列表吗? (我是 Java 8 的新手,所以这可能看起来是一个愚蠢的问题,但我们将不胜感激)

编辑 1使用 FlatMap 实现如下 -请建议是否还有其他更好的方法。希望有一天它能对某人有所帮助:)继续分享。

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

最佳答案

使用flatMap是获得平面列表的规范方法。您可以使用单个步骤代替 map + flatMap :

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

您可能会考虑 getListOfCustomObjForEachStr 的替代方案返回 Stream首先。此外,不存在 Files.lines ,它返回行字符串流,而不填充临时 List首先。

在这种特殊情况下,还有一个替代方案。考虑到.collect(Collectors.toList())相当于 .collect(ArrayList::new, List::add, List::addAll) ¹,您还使用

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

替换addaddAll ,这已经足以添加所有子 List<MyCustomObjects>结果 List<MyCustomObjects> .

<小时/>

¹ 就是这样toList()现在可以工作,但由于没有指定这样做,因此在其他版本中可能会有所不同

关于Java 8 流 + 映射 + ForEach + 收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41668634/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com