在java中,递归地将字符串附加到字符串列表

在java中,递归地将字符串附加到字符串列表,java,list,arraylist,Java,List,Arraylist,我有一个字符串列表,我想在列表中的每个字符串前面添加文本。我试图在不使用for/Iterator循环的情况下实现这一点,就像一行代码一样。我找不到解决这个问题的办法 下面我尝试了一个for循环,但需要没有这个的解决方案。有解决办法吗 List<String> strings = new ArrayList<String>(); strings.add("a"); strings.add("b");

我有一个字符串列表,我想在列表中的每个字符串前面添加文本。我试图在不使用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);
}

请帮忙。谢谢。

也许是这样的吧

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

这更像是一个函数式的解决方案,上面代码的问题是,字符串将在类中被销毁。如果希望避免这种情况,可以在调用递归操作之前进行深度复制

您可以使用Google Guava之类的库编写一个“功能风格”版本。但这通常被视为不如循环更可取/更清晰

List<String> results = Lists.transform( inputs, new Function<String,String() {
    public String apply (String input) {
        return "D"+input;
    }
};
这是为GoogleGuava编写的,但Apache也有一个“功能性”风格的库

实际上,在字符串上添加一个公共前缀的用例不是很好。用户不希望看到每个项目上都有多余的前缀。。在UI中,前缀应在标题中显示一次。

第一个想法:LINQ:

对于Java,似乎有两种LINQ替代方案,请参见:在这里,您可能会幸运地找到一些可以工作的东西

我将为您提供几个可能无法测试的示例:

兰姆达斯

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

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

位于。根据所提供的样本,类似这样的方法也可能有效:

List<String> res = strings.select(append("D")).toList();

如果您使用的是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);
  }
}

即使您现在没有使用Java8,也应该注意到这些特性已经添加,如果您在一两年内遇到类似的问题,那么您可以使用新API中的一些东西

为什么??如果有的话,它的可读性就会差得多。你提出的技术似乎对大多数目的都没有用处。你能解释一下你为什么要这么做吗?这是家庭作业吗?不,这不是家庭作业,但我的一位同事想知道这是否可行。类似appendedList=StringUtils.appendx,stringsyou可以通过新的ArrayListstrings传入列表,但ok..您希望在每个字符串前面追加文本。如果在前端添加内容,则称为前置。这是避免循环的一个很好的答案-用递归替换它!但是您忘记了实际转换数据。您也可以在scala中轻松实现这一点,比如strings.asScala.mapD+\uJava。您必须导入scala.collection.JavaConverters。就执行速度而言,这个解决方案比循环快吗?@seinecle-我猜它是通过某种循环在内部实现的,但它仍然会在每个迭代中增加至少一个额外的函数调用lambda,所以我猜它会更慢。但是,我不确定Hotspot编译器在内联lambda方面有多好,所以如果这是在代码的关键区域,使用这个vs a循环可能会编译成类似的机器代码。
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);
$ java StringTest
[Da, Db, Dc, Dd]