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

嵌套循环到Java流之谜

和选
2023-03-14

我是Java8中的流的新手。我正在努力弄清楚如何在使用流的列表上实现嵌套的for循环。一个列表包含消息,消息中的一个字段是作者的id(不幸的是,不是obj引用)。另一个列表是作者,作者中的一个字段是作者ID。代码需要为消息列表中的每条消息在authors列表中找到匹配的作者。我拥有的工作Java代码(它不使用流或lambda)如下所示,我的问题是如何使用流重写它?我尝试了一些事情,我想一个平面地图和一个过滤器将是需要的,但我似乎不能得到它的正确。

public void showAuthors(List<Message> messages, List<Authors> authors) {
    String authorName=null;
    for (Message message : messages) {
        int authorId = message.getAuthorId();
        for (Authors author : authors) {
            if (author.getId() == authorId)
                authorName = author.getFullName();
                break;
        }
        System.out.println("Message id is " + message.getId() + 
                           " author is " + authorName);
    }
}

我在这里看过一些类似的问题,但我似乎就是做不对。

感谢任何帮助!

更新:作者列表的Id字段有一些空数据。这要求我在流操作中使用过滤器来创建AuthorId、name的映射。

共有1个答案

孙恩
2023-03-14

您不需要流来处理消息,这里forEach更合适。尽管如此,流对于作者列表到映射转换还是很有用的。

您可以使用带有3个参数的toMap来避免authors列表中可能的authors重复(原始代码避免了这一点)。

您可以使用Optional来避免可能存在的authos缺失、null id等--每次map返回null,Optional变成Optional::empty,因此对它的进一步处理一直跳过到终端操作,而ifPresence只是跳过空的选项。

Map<Integer, String> authorNames=authors.stream()
    .collect(Collectors.toMap(
        Author::getId,
        Author::getFullName,
        (oldValue, newValue) -> oldValue));

messages.forEach(
    m -> Optional.of(m)
        .map(Message::getAuthorId)
        .map(authorNames::get)
        .map(name -> "Message id is " + m.getId() + " author is " + name)
        .ifPresent(System.out::println)
);
 类似资料:
  • 问题内容: 我有以下for循环: 如何将这个嵌套循环重构为Java 8流? 问题答案: 您可以使用来获取s中所有s的所有:

  • 和其他编程语言一样, Java 允许循环嵌套。如果把一个循环放在另一个循环体内,那么就可以形成嵌套循环。 嵌套循环既可以是 for循环嵌套 while 循环,也可以是 while 循环嵌套 do-while 循环 …… 即各种类型的循环都可以作为外层循环,也可以作为内层循环。 当程序遇到嵌套循环时,如果外层循环的循环条件允许,则开始执行外层循环的循环体,而内层循环将被外层循环的循环体来执行——只是

  • 大家好,初学者, 被困在这里一段时间了。故障排除我要么得到一个无限循环,要么它只循环11次(我希望外部循环21次)。基本上,我读这是因为第一个循环将被执行,因为它将是真的,第二个循环将被执行十次,直到它不是真的。然后外部循环将绕过内部循环继续运行(因为条件不再有效),直到外部条件不再为真。 提前道谢!

  • 转换是否正确,或者是否有更好的方法将嵌套循环转换为流计算? 为什么流变体比旧变体慢得多? 为什么parallel()语句实际上将时间从0.19s增加到0.25s? 我知道微基准是脆弱的,并行性只有在遇到大问题时才值得,但对于CPU来说,即使是0.1秒也是永恒的,对吗? 更新 null

  • 我正在迭代两个不同大小的列表: 我要做的是:遍历这两个列表并从array1中挑出所有元素,为此我可以在array2中找到一个元素,该元素与array1中的元素相加产生一定的和。 有没有人知道我怎么用流来处理这个案子?

  • Python 不仅支持 if 语句相互嵌套,while 和 for 循环结构也支持嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,甚至 while 中有 for 或者 for 中有 while 也都是允许的。 当 2 个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称为 外层循环或 外循环,位于内层的循环结构常简