我有以下任务.

我们有two lists个:第一个是Integer类型的integerList,第二个是String类型的stringList.

目标是:

  • 对于integerList中的每个值n,从stringList中 Select 一个以digit开头、长度为n的字符串;
  • 如果stringList个字符串中有多个必填字符串,则 Select 第一个;
  • 如果没有必需的字符串,则将"Not found"作为适当的元素.

My code:

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());
}

我不知道在filter米中我应该用什么.

Input:

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

Desired output:

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

推荐答案

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

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

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

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);

Output:

[1, 1aa, Not Found]

这也可以通过在map()操作内创建嵌套流来实现,也就是以试图实现它的方式.为此,您需要在findFirst()之前应用的filter()中使用以下predicate:

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

这样的解比第一个使用Map的解是less performant,因为它需要迭代字符串列表和整数列表中的元素一样多的次数.同时,基于 map 的方法只需要一次迭代.

Java相关问答推荐

使用ExecutorService时在ThreadFactory中触发自定义newThread函数

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

为什么使用JDK21获取锁定锁比使用JDK11慢

无法使用Java&;TestContainers获取AWS SQS队列的属性

对于亚洲/香港,使用ResolverStyle.STRICT的LocalDate.parse返回意外结果

如何在Application.yaml中连接字符串?

如何从日志(log)行中删除包名称?

如何使用log4j2(Json)记录由";异常引起的所有";?

垃圾回收器是否真的删除超出作用域的对象?

为什么我不能建立输入/输出流?Java ServerSocket

如何从命令行编译包中的所有类?

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

Java System.getProperty在哪里检索user.home?

如何设置默认序列生成器分配大小

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

为什么Java编译器为没有参数的方法(getter方法)创建桥接方法

为什么child-pom会创建一个新版本