gpt4 book ai didi

java - 如何使用 Stream Api 和 Java 8 将 List 中的值映射到 List 中的元素

转载 作者:行者123 更新时间:2023-12-02 18:05:11 25 4
gpt4 key购买 nike

我有以下任务。

我们有两个列表:第一个integerList类型为Integer,第二个stringList类型为字符串

目标是:

  • 对于 integerList 中的每个值 n,从 stringList 中选择一个以数字开头并具有长度n;
  • 如果stringList中有多个必需的字符串,则选择第一个;
  • 如果没有必需的字符串,请将“未找到” 作为适当的元素。

我的代码:

public static List<String> foo(List<Integer> integerList, List<String> stringList) {
return integerList.stream()
.map(integer -> stringList.stream()
.filter(...) // not sure what to use here
.findFirst()
.orElse("Not found"))
.collect(Collectors.toList());
}

我不确定应该在过滤器中使用什么。

输入:

integerList = [1, 3, 4]
stringList = ["1aa", "aaa", "1", "a"]

期望的输出:

["1", "1aa", "Not Found"]

最佳答案

您可以从字符串列表生成 map Map<Integer,String> ,它将字符串长度与列表中具有该长度的第一个字符串相关联。

然后处理整数列表的内容。

要仅过滤那些以数字开头的字符串,我们可以使用以下正则表达式 "^//d.*" ,它将匹配任何以数字作为其第一个字符,后跟零个或多个字符的字符串。

List<Integer> integerList = List.of(1, 3, 4);
List<String> stringList = List.of("1aa", "aaa", "1", "a");

Map<Integer, String> strByLength = stringList.stream()
.filter(str -> str.matches("^//d.*")) // string starts with a digit
.collect(Collectors.toMap(
String::length, // key
Function.identity(), // value
(left, right) -> left // pick the first encountered value
));

List<String> result1 = integerList.stream()
.map(i -> strByLength.getOrDefault(i, "Not Found"))
.toList();

System.out.println(result1);

输出:

[1, 1aa, Not Found]

也可以通过在 map() 内创建嵌套流来完成操作,即以试图实现它的方式。为此,您需要在 filter() 内使用以下谓词之前申请过findFirst() :

.filter(str -> str.length() == integer)

请注意,与使用 Map 的第一个解决方案相比,此类解决方案性能较差 ,因为它需要对字符串列表进行迭代,次数与整数列表中的元素相同。同时,基于 map 的方法只需要一次迭代。

关于java - 如何使用 Stream Api 和 Java 8 将 List<Integer> 中的值映射到 List<String> 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73434757/

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