当前位置: 首页 > 知识库问答 >
问题:

如何将这个传统的for循环转换为Java流?

漆雕和雅
2023-03-14

我最近学习了Java流,并尝试通过转换我以前的一些代码片段来实践一些流特性。程序中的以下传统for循环是将原始数组中的索引及其反向字符串存储到映射中。

String[] words = {"hey", "there", "how", "are", "you"};
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < words.length; i++) {
    String rev = new StringBuilder(words[i]).reverse().toString();
    map.put(rev, i);
}

然而,我很难使用纯流实现同样的事情。我认为我的问题是如何同时跟踪索引和反向字符串。从传统的for循环中可以看到,我正在将字符串转换为stringBuilder,然后将其反转,然后转换回字符串。最后我把索引和字符串映射。但是我想不出用纯流来跟踪所有这些的方法。有人能启发我吗?谢谢!

共有2个答案

闻人哲茂
2023-03-14

在您学习streams时,我提供了这个可选的收集器。toMap方法。它允许您使用合并功能并指定地图的类型。在这种情况下,不使用合并函数,而是通过使用LinkedHashMap,保留映射的顺序。

Map<String, Integer> map =
        IntStream.range(0, words.length).boxed()
                .collect(Collectors.toMap(
                        i -> new StringBuilder(words[i])                                     
                             .reverse().toString(),
                        i -> i,
                        // merge is unused
                        (r, s) -> s, 
                        // supplier for the type of map
                        LinkedHashMap::new));

System.out.println(map);

印刷品

{yeh=0, ereht=1, woh=2, era=3, uoy=4}
仲涵亮
2023-03-14

它可以通过IntStream来完成,IntStream模仿for循环:

Map<String, Integer> map = IntStream.range(0, words.length).boxed()
    .collect(Collectors.toMap(
        i -> new StringBuilder(words[i]).reverse().toString(), // key: reversed string
        i -> i // value: index in array
    ));
 类似资料:
  • 我已经了解了一些关于流的知识,并且知道它们可以用来代替循环。对于这个玩具示例,我使用一个图形数据库来存储一组字符串。数据库将它们存储为顶点。我想检索这些顶点,并将它们转换为字符串,而是使用流。每个顶点都有一组性质;我给它一个键,它返回一个值。如果一个顶点具有我正在寻找的属性,我将它添加到列表中。如果没有,我存储顶点ID。 我有一个for循环,但我不确定如何使用流来代替。代码如下:

  • 我已经开始使用Java8,并尝试将代码中的一些循环和旧语法转换为lambdas和streams。 举个例子,我试图转换这个time和for循环到流,但我没有得到它的权利: 我想知道是否有可能将上面的示例转换为单个流,其中for循环内部有一个而循环。

  • 问题内容: 我正在尝试将此for循环重写为for每个循环。 这就是我尝试过的 谁能指出我正确的方向?谢谢。 问题答案: 我认为您想得太多… :)

  • 问题内容: 是否每个递归函数都有一个等效的for循环?(两者都达到相同的结果)。 我有这个递归函数: 假设单词是Set [],并且单词[i] =单词长度为i的集合。 我想做的是:使用一个单词(例如,“ stackoverflow”,没有空格)启动递归,我试图查找该单词是否可以切成子单词(“ stack”,“ over”,“ flow”) ..子词的最小长度为3,并且假设长度为i的子词在Set wo

  • 想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。 什么是最好的 注意:我知道我可以使用: 但要做到这一点,我需要将所有变量声明为原子整数,这使得代码冗长 一定有比使用原子整数更好的方法。有?