还在学习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()中使用的电子邮件。我该如何解决这个问题?
保持一个流
.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());
在将电子邮件映射到其主机之前,应该使用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]
或者将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做到这一点。。。像这样的 我想要的输出是这样的 但我无法理解