還在學習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() 中使用的電子郵件。我該如何解決?
uj5u.com熱心網友回復:
要么放在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());
uj5u.com熱心網友回復:
在將電子郵件映射到其主機之前,您應該使用 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("[email protected]", "host1"));
userData.emails.add(new Email("[email protected]", "host2"));
userData.emails.add(new Email("[email protected]", "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]
uj5u.com熱心網友回復:
保持一個Stream<Email>直到你不需要它們。
.peek(email -> System.out.println("email=" email " host=" email.getHost()))
.map(Email::getHost)
如果主機計算有點昂貴,您可以制作一個Stream<Map.Entry<Email, String>>并將它們都放在下游。
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());
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/399172.html
