我有一个String列表,我想在列表中的每个String前面附加文本。我试图在没有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);
}
请帮忙。感谢。
答案 0 :(得分:5)
如果您使用的是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中的内容!
答案 1 :(得分: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");
这是一个更实用的解决方案,上面代码的问题是,如果你想避免这种情况,在调用递归操作之前,你可以在类中销毁字符串,你可以进行深层复制!
答案 2 :(得分:1)
首先想到:LINQ:)
似乎有一些针对Java的LINQ替代方案(请参阅:Is there a Java equivalent for LINQ?和What is the Java equivalent for LINQ?),您可能会很幸运找到有效的方法。
我将为您提供一些可能有效的示例(未经测试):
<强> LambdaJ 强>
使用LambdaJ的转换功能,我想这样的事情应该有效:
List<String> res = extract(strings, on(String.class).toString() + "D");
<强> JPropel光强强>
位于github。根据提供的样本,这样的东西也可以起作用:
List<String> res = strings.select(append("D")).toList();
答案 3 :(得分: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中,前缀应在标题中显示一次。