4

我有一个字符串列表,我想在列表中的每个字符串前面附加文本。我试图在没有像一行代码这样的 for/Iterator 循环的情况下实现这一点。我找不到解决方案。

下面我尝试了一个 for 循环,但需要没有这个的解决方案。有解决办法吗?

   List<String> strings = new ArrayList<String>();
                strings.add("a");
                strings.add("b");
                strings.add("c");
            strings.add("d");

List<String> appendedList = new ArrayList<String>();
for (String s : strings) {
    appendedList.add("D" + s);
}

请帮忙。谢谢。

4

4 回答 4

9

如果您使用的是 Java 8,那么您可以使用新添加的replaceAll方法来执行此操作:

strings.replaceAll(s -> "D"+s);

这是一个完整的工作示例:

import java.util.Arrays;
import java.util.List;

public class StringTest {
  public static void main(String[] args) {
    List<String> strings = Arrays.asList("a", "b", "c", "d");
    strings.replaceAll(s -> "D"+s);
    System.out.println(strings);
  }
}

您也可以使用新的 Streams API 来执行此操作,但稍微冗长一些,制作列表的副本而不是改变(更新)原始列表:

List<String> strings = Arrays.asList("a", "b", "c", "d");
strings = strings.stream()
                 .map(s -> "D"+s) // Using Lambda notation to update the entries
                 .collect(Collectors.toList());
System.out.println(strings);

请注意,我曾经Arrays.asList()更简洁地创建列表。这不是 Java 8 中的新功能,因此您应该也可以在 Java 5/6/7 中使用它。这是我的输出:

$ java StringTest
[Da, Db, Dc, Dd]

即使您现在没有使用 Java 8,仍然需要注意这些功能已被添加,如果您在一两年内遇到类似问题,那么您可以使用新 API 中的一些东西!

于 2013-09-27T00:45:59.857 回答
2

可能是这样的

public List<String> recursiveAdd(List<String> strings, List<String> finalList, String prepender){
   if(strings == null || strings.size() == 0) return finalList;
   else{
       finalList.add(prepender + strings.remove(0));
       return recursiveAdd(strings,finalList,prepender);
   }
} 

strings = recursiveAdd(strings, new ArrayList<String>(), "D");

这更像是一个功能解决方案,上面代码的问题是字符串将在类内部被破坏,如果您想避免这种情况,您可以在调用递归操作之前进行深层复制!

于 2013-09-26T23:36:54.627 回答
1

第一个想法:LINQ :)

似乎有一些 Java 的 LINQ 替代方案(请参阅:Is there a Java equivalent for LINQ?What is the Java equivalent for LINQ?),您可能很幸运能找到可行的方法。

我将为您提供几个可能有效的示例(未经测试):

拉姆达J

使用LambdaJ的转换功能,我想这样的事情应该可以工作:

List<String> res = extract(strings, on(String.class).toString() + "D");

JPropel-光

位于github。根据提供的示例,这样的事情也可能有效:

List<String> res = strings.select(append("D")).toList();
于 2013-09-26T23:54:24.247 回答
0

您可以使用诸如 Google Guava 之类的库编写“功能样式”版本。但这通常被认为比循环更不受欢迎/清晰。

List<String> results = Lists.transform( inputs, new Function<String,String() {
    public String apply (String input) {
        return "D"+input;
    }
};

这是为 Google Guava 编码的,但 Apache 也有一个“功能”样式库。

实际上,这种在字符串上添加公共前缀的用例并不是很好。用户不想看到每个项目上的冗余前缀。在 UI 中,前缀应该在标题中显示一次。

于 2013-09-26T23:39:23.017 回答