将循环(while和for)转换为流

Joe*_*Joe 6 java java-8 java-stream

我已经开始使用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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以将上面的示例转换为单个流,其中for循环内部有一个while循环.

Chr*_*ris 6

如上所述,在这里使用流并没有真正增加价值,因为它使代码更难以阅读/理解.我知道你做的更多是学习练习.话虽这么说,做这样的事情是一种稍微更具功能性的方法,因为它没有从流本身添加到列表中的副作用:

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());
Run Code Online (Sandbox Code Playgroud)


Rob*_*per 5

我不明白为什么你想在这里使用流,但这是可能的。

创建一些测试输入:

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<>();
Run Code Online (Sandbox Code Playgroud)

实际代码:

oldList.stream()
    .forEach(line -> map.entrySet().stream()
            .filter(entry -> line.startsWith(entry.getKey()))
            .forEach(entry -> list.add(line.replace(entry.getKey(),entry.getValue()))));
Run Code Online (Sandbox Code Playgroud)

打印结果:

list.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

这是:

xddx
yddy
zddz
Run Code Online (Sandbox Code Playgroud)