【问题标题】:Convert two for loops to Java Stream?将两个 for 循环转换为 Java Stream?
【发布时间】:2020-04-05 23:13:35
【问题描述】:

我有以下嵌套的 for 循环,我想将其转换为使用流,因为我目前正在学习使用流,我该怎么做?

我在下面添加了我当前的尝试,但它目前不完整。

Part part = getPart();
List<Machines> machines = new ArrayList<>();
List<String> identities = getMachineIdentities();
Set<MachinePart> machineParts = new HashSet<>();

    //create machines
    for (String identity : identities) {
               Machine machine = getMachine(identity);
               machines.add(machine);
           }

    //map to MachineParts
    for (Machine machines : machines) {
               MachinePart machinePart = MachinePartCreator.new(machines, part);
               machineParts.add(machinePart);
           }

串流尝试:

Set<MachinePart > machineParts = identities.stream()
    .map(identity-> ??? ).collectors.collect(Collectors.toSet()));

【问题讨论】:

    标签: java for-loop collections stream collectors


    【解决方案1】:

    您的第一个循环为第二个循环创建输入。这可以通过两个map() 调用来实现:

    Set<MachinePart> machineParts =
        identities.stream()
                  .map(id -> getMachine(id))
                  .map(m -> MachinePartCreator.new(m, part))
                  .collect(Collectors.toSet());
    

    甚至一个:

    Set<MachinePart> machineParts =
        identities.stream()
                  .map(id -> MachinePartCreator.new(getMachine(id),part))
                  .collect(Collectors.toSet());
    

    当然,你也可以用一个for循环编写原始代码,跳过中间的List&lt;Machines&gt; machines

    【讨论】:

    • 谢谢,两个 .map() 行中发生了什么?只是想知道我自己的知识。
    • @java12399900 第一个map 调用将Stream&lt;String&gt; 转换为Stream&lt;Machine&gt;,第二个map 调用将Stream&lt;Machine&gt; 转换为Stream&lt;MachinePart&gt;
    • 谢谢,这里使用stream有什么好处,感觉loops更容易调试和阅读?
    • @java12399900 我认为这样的基本代码不需要太多调试。一旦你习惯了 Streams,它们可能会变得更容易阅读。
    • 一般来说有什么优势?
    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多