Java 8 将流转换为IntStream

Java 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

我正在为两个列表的主地址相等的每个列表项设置id

服务器POJO

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)