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

从映射流重用lambda

司空福
2023-03-14

还在学习Java8。我的代码看起来像:

List<String> list = userData.getEmails().stream()  
          .map(email -> codeThatGetsTheHost(email))  
          .peek((email, host) -> {//Only print if email is not null
                System.out.println("email=" + email + " host=" + host);})  
          .collect(Collectors.toList());  //should collect hosts.

上述代码不起作用,因为peek()无法访问主流变量,即map()中使用的电子邮件。我该如何解决这个问题?

共有3个答案

欧阳杰
2023-03-14

保持一个

.peek(email -> System.out.println("email=" + email + " host=" + email.getHost()))
.map(Email::getHost)

如果主机计算有些昂贵,您可以创建一个Stream

userData.getEmails()
    .stream()
      .filter(Objects::nonNull)
      .map(email -> new AbstractMap.SimpleEntry<>(email, codeThatGetsTheHost(email)))
      .peek(entry -> System.out.println("email=" + entry.getKey() + " host=" + entry.getValue()))
      .map(Map.Entry::getValue)
    .collect(Collectors.toList());

华坚成
2023-03-14

在将电子邮件映射到其主机之前,应该使用peek。这是您案例的示例代码:

import java.util.*;  
import java.util.stream.Collectors;


class Email{
    public String email;
    private String host;
    public Email(String email, String host){
        this.email = email;
        this.host = host;
    }
    public String getHost(){
        return host;
    }
}

class UserData{
    List<Email> emails = new LinkedList<>();
    public List<Email> getEmails(){
        return emails;
    }
}

public class MyClass {
    public static void main(String args[]) {
      UserData userData = new UserData();
      userData.emails.add(new Email("a@s.com", "host1"));
      userData.emails.add(new Email("b@s.com", "host2"));
      userData.emails.add(new Email("c@s.com", "host3"));
      List<String> list = userData.getEmails().stream()
          .peek(email -> System.out.println("email=" + email + " host=" + email.getHost()))  
          .map(email -> email.getHost())  
          .collect(Collectors.toList());
      System.out.println(list);
    }
}

email=Email@7bfcd12c host=host1
email=Email@1c2c22f3 host=host2
email=Email@18e8568 host=host3
[host1, host2, host3]
魏君博
2023-03-14

或者将peek放在map之前,以访问所需的所有数据:

List<String> list = userData.getEmails().stream()  
          .peek(email -> System.out.println("email=" + email + " host=" + email.getHost())) 
          .map(email -> email.getHost())   
          .collect(Collectors.toList());

或者在map方法中执行这两个动作(完全合法),以避免重复getter调用:

List<String> list = userData.getEmails().stream()  
          .map(email -> {
               String host = email.getHost();
               System.out.println("email=" + email + " host=" + host));
               return host;
          })
          .collect(Collectors.toList());
 类似资料:
  • YAML中的流映射表示键值对的无序集合。 它们也称为映射节点。 请注意,键应保持唯一。 如果流映射结构中存在重复的键,则会生成错误。 键顺序在序列化树中生成。 示例 流映射结构的示例如下所示 - JSON格式的映射序列(无序列表)的输出如下所示 - 如果如上所示观察此输出,则会发现在YAML映射结构中键名称是唯一的。

  • 我有一个实体,看起来像这样: 输入数据是一个

  • 如果我执行以下“连接”两个流的代码 < li >首先通过平面映射< code >流 我在两种情况下都获得了相同的正确结果,但过滤操作的次数不同。 我在两种情况下都得到了预期的结果(3)。但是,第一个操作对集合的每个元素应用第一个过滤器,而第二个操作在遇到一个过滤器时就停止。输出是: 为什么两者之间的行为有所不同?JDK代码在第一个场景中是否可以改进为与第二个场景中一样高效,或者是否有一些东西使其不

  • 我有一些代码需要帮助...我正在尝试使用两个地图作为源并同时使用java lambdas构建地图 我可以用你们在上面看到的foreach做到这一点,但我试图用lambdas做到这一点。。。像这样的 我想要的输出是这样的 但我无法理解