我已经开始使用Java 8并尝试将代码中的一些循环和旧语法转换为lambdas和流。
因此,例如,我正在尝试将此转换为for循环以转换为流,但我没有做到正确:
List<String> list = new ArrayList<>();
if (!oldList.isEmpty()) {// old is a List<String>
Iterator<String> itr = oldList.iterator();
while (itr.hasNext()) {
String line = (String) itr.next();
for (Map.Entry<String, String> entry : map.entrySet()) {
if (line.startsWith(entry.getKey())) {
String newline = line.replace(entry.getKey(),entry.getValue());
list.add(newline);
}
}
}
}
我想知道是否可以将上面的示例转换为在for循环中有while循环的单个流。
答案 0 :(得分:5)
如上所述,在这里使用流并没有真正增加价值,因为它使代码更难阅读/理解。我知道你做的更多是学习练习。话虽这么说,做这样的事情是一种稍微更具功能性的方法,因为它没有从流本身内部添加到列表中的副作用:
list = oldList.stream().flatMap(line->
map.entrySet().stream()
.filter(e->line.startsWith(e.getKey()))
.map(filteredEntry->line.replace(filteredEntry.getKey(),filteredEntry.getValue()))
).collect(Collectors.toList());
答案 1 :(得分:3)
我不明白你为什么要在这里使用流,但这是可能的。
创建一些测试输入:
List<String> oldList = Arrays.asList("adda","bddb","cddc");
Map<String,String> map = new HashMap<>();
map.put("a", "x");
map.put("b", "y");
map.put("c", "z");
List<String> list = new ArrayList<>();
实际代码:
oldList.stream()
.forEach(line -> map.entrySet().stream()
.filter(entry -> line.startsWith(entry.getKey()))
.forEach(entry -> list.add(line.replace(entry.getKey(),entry.getValue()))));
打印结果:
list.forEach(System.out::println);
这是:
xddx
yddy
zddz
答案 2 :(得分:3)
要回答你的问题,这是一个单行程序:
List<String> list = oldList.stream()
.filter(line -> map.keySet().stream().anyMatch(line::startsWith))
.map(line -> map.entrySet().stream()
.filter(entry -> line.startsWith(entry.getKey()))
.map(entry -> line.replace(entry.getKey(), entry.getValue()))
.findFirst().get())
.collect(Collectors.toList());
答案 3 :(得分:1)
您可以使用嵌套在从oldList
列表创建的流中的流来实现它。嵌套流扮演的角色是将oldList
的当前值与map
中定义的映射器进行映射,例如
public static void main(String[] args) {
final List<String> oldList = Arrays.asList("asd-qwe", "zxc", "123");
final Map<String, String> map = new HashMap<String, String>() {{
put("asd", "zcx");
put("12", "09");
put("qq", "aa");
}};
List<String> result = oldList.stream()
.map(line -> map.entrySet()
.stream()
.filter(entry -> line.startsWith(entry.getKey()))
.map(entry -> line.replace(entry.getKey(), entry.getValue()))
.collect(Collectors.toList())
)
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println(result);
}
以下示例生成如下输出:
[zcx-qwe, 093]
如果需要,可以轻松并行化建议的解决方案。功能方法,无副作用。