Java 8 将流转换为IntStream
我正在为两个列表的主地址相等的每个列表项设置id 服务器POJOJava 8 将流转换为IntStream,java-8,functional-programming,java-stream,Java 8,Functional Programming,Java Stream,我正在为两个列表的主地址相等的每个列表项设置id 服务器POJO public class Server { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") public Integer id; @OneToMany (mappedBy = "server",cascade = CascadeType.ALL, orphanRemoval = true
public class Server {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
public Integer id;
@OneToMany (mappedBy = "server",cascade = CascadeType.ALL, orphanRemoval = true)
private List<IPAddress> ipaddresses;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public void setIpaddresses(List<IPAddress> ipaddresses) {
this.ipaddresses = ipaddresses;
}
public List<IPAddress> getIpaddresses() {
return ipaddresses;
}
}
以下是我替换重复项的逻辑
Set<String> primaryIpAddresses = importServerList.stream()
.map(Server::getPrimaryIpAddress)
.collect(Collectors.toSet());
Set<Integer> currServerId = currServerList.stream()
.filter(s->primaryIpAddresses.contains(s.getPrimaryIpAddress()))
.map(Server::getId)
.collect(Collectors.toSet());
List<Server> filteredList=currServerList.stream()
.filter(s->!primaryIpAddresses.contains(s.getPrimaryIpAddress()))
.collect(Collectors.toList());
filteredList.addAll(importServerList);
filteredList.stream().filter(s->primaryIpAddresses.contains(s.getPrimaryIpAddress())).forEach(s->s.setId(currServerList.stream().filter(server->currServerId.contains(server.getId())).mapToInt(Server::getId)));
注意:currServerList是db和importServerList中的一个列表,我正在将服务器导入db中,因此,当我替换currServerList时,importServerList将没有id,我想更新服务器(替换为importServerList),而不是重复
Set<String> primaryIpAddresses = importServerList.stream()
.map(Server::getPrimaryIpAddress)
.collect(Collectors.toSet());
Set<Integer> currServerId = currServerList.stream()
.filter(s->primaryIpAddresses.contains(s.getPrimaryIpAddress()))
.map(Server::getId)
.collect(Collectors.toSet());
List<Server> filteredList=currServerList.stream()
.filter(s->!primaryIpAddresses.contains(s.getPrimaryIpAddress()))
.collect(Collectors.toList());
filteredList.addAll(importServerList);
filteredList.stream().filter(s->primaryIpAddresses.contains(s.getPrimaryIpAddress())).forEach(s->s.setId(currServerList.stream().filter(server->currServerId.contains(server.getId())).mapToInt(Server::getId)));
答案中前面的代码是为所有服务器设置相同的id,但我尝试在没有函数编程的情况下使用simple for each循环,如下所示
for(Server srv : filteredList) {
for(Server dbsrv : currServerList) {
logger.debug("dbsrv ipadd --> " + dbsrv.getPrimaryIpAddress());
logger.debug("impsrv ipadd --> " + srv.getPrimaryIpAddress());
if(dbsrv.getPrimaryIpAddress()!= null && dbsrv.getPrimaryIpAddress().equals(srv.getPrimaryIpAddress())) {
srv.setId(dbsrv.getId());
logger.debug("in setting server id");
break;
}
}
}
现在检查null是必要的,因为它在该行抛出异常,因为db中有一些数据是错误的,因此我在某种程度上做了防御编码,但现在我需要使用函数编程编写上述相同的代码。更改
s->s.setId(currServerList
.stream()
.filter(server->currServerId.contains(server.getId()))
.mapToInt(Server::getId)
到
答案是假设.filter(server->currServerId.contains(server.getId())
与任何内容都不匹配,则让它返回0作为默认条件
您可以将其更改为适合您的默认值。不确定这一行
IntStream.currServerList.stream().
这可能吗?@manfromnowhere在我这样使用时不工作……你有我的问题吗?当我根据主IP地址等于importServerList的服务器替换currServerList中的服务器时,我需要将替换的currServerList服务器的id设置到importServerList中。有一个函数被调用mapToInt
可能有问题,您应该试试这种方法。你所做的是完全错误的。Stream
@manfromnowhere中没有这样的东西不工作,因为我有List not List并看到了我上面的注释findfirst().get().getId())对应的代码可以这样做吗?是的,但是如果值不存在,它会引发异常。如果您同意,也可以这样做,您可以通过更改顺序来消除每个元素执行两个getId
调用的冗余:.map(Server::getId).filter(currServerId::contains).findFirst().ifPresent(s::setId)
。由于源数据是一个整数
,而目标方法接收到一个整数
,因此在这里使用IntStream
会导致在末尾执行不必要的装箱操作。因此,您可以使用map
而不是mapToInt
@Holger我已经更新了我的问题,请查看最后一个问题。在上述情况下,如何使用函数编程编写等效代码
s->s.setId(currServerList
.stream()
.filter(server->currServerId.contains(server.getId()))
.mapToInt(Server::getId)
s->s.setId(currServerList.stream()
.filter(server->currServerId.contains(server.getId()))
.mapToInt(Server::getId)
.findFirst()
.orElse(0)