Java 8 使用函数式编程对列表中的服务器对象进行流和过滤<;服务器>;

Java 8 使用函数式编程对列表中的服务器对象进行流和过滤<;服务器>;,java-8,functional-programming,Java 8,Functional Programming,我有两个Listcurrent和ListserverList,但我想从当前服务器中筛选出serverList中已经存在的服务器 现在,它将检查的唯一基础是List,它位于上述两个列表中 IPAddress POJO有两个字段字符串IPAddress,布尔主 列表有多个辅助ip,但有一个唯一的主ip,因此我们需要基于此主ip进行筛选,并且我们只能检查它是否为布尔值true,以了解其主ip是否为 我认为这将使一个非常复杂的流过滤器逻辑,因此我需要帮助我尝试,但我不是在函数编程专家 serverLis

我有两个
List
current和
List
serverList,但我想从当前服务器中筛选出serverList中已经存在的服务器

现在,它将检查的唯一基础是
List
,它位于上述两个列表中

IPAddress POJO有两个字段字符串
IPAddress,布尔主

列表有多个辅助ip,但有一个唯一的主ip,因此我们需要基于此主ip进行筛选,并且我们只能检查它是否为布尔值true,以了解其主ip是否为

我认为这将使一个非常复杂的流过滤器逻辑,因此我需要帮助我尝试,但我不是在函数编程专家

serverList.stream().filter(new Predicate<? extends Server>() {

                })

这其实很简单

首先,在服务器中添加一个方法以获取其主地址:

public String getPrimaryIpAddress() {
    return ipaddresses.stream()
        .filter(IPAddress::isPrimary)
        .findAny()
        .orElseThrow(() -> new IllegalStateException("there should be a primary address")
        .getIpaddress();
}
然后创建一组主地址

List<Server> serverList = ...
Set<String> primaryIpAddresses = serverList.stream()
    .map(Server::getPrimaryIpAddress)
    .collect(Collectors.toSet());
List服务器列表=。。。
Set primaryipaddress=serverList.stream()
.map(服务器::GetPrimaryPaddress)
.collect(收集器.toSet());
然后筛选服务器列表:

List<Server> currrent = ...

List<Server> filtered = current.stream()
    .filter(s -> !primaryIpAddresses.contains(s.getPrimaryIpAddress()))
    .collect(Collectors.toList());
列表当前租金=。。。
List filtered=current.stream()
.filter(s->!PrimaryPaddress.contains(s.GetPrimaryPaddress()))
.collect(Collectors.toList());

它仍然不是完整的可验证示例。我脑子里仍然有一些不清楚的问题,比如服务器类是什么样子,如何比较?基于某些属性或对象相等性?@Emre现在可以了吗?还是我没有提供的东西仍然缺少?@Emre解决这个问题可能会让我在使用Lambda表达式的java函数编程方面有一点优势现在看起来好多了,通过这种方式,用户可以理解和表示问题域
IPAddress::isPrimary
您能给我一点解释为什么要在服务器方法的getters中进行筛选吗?因为您需要一个返回服务器所有地址中主地址的方法。我不是在过滤“获取者”。我添加了一个方法来获取服务器的主地址。有什么问题吗?你为什么不添加这样的方法?在您看来,它有什么奇怪之处?因为在服务器POJO中没有主地址这样的字段,而是在IPAddress中。服务器可以为每个服务器获取具有多个辅助但uinque primary的列表方法不必返回字段。方法返回它想要/需要返回的任何内容。这个方法的职责是找到服务器的主地址并返回它。
List<Server> serverList = ...
Set<String> primaryIpAddresses = serverList.stream()
    .map(Server::getPrimaryIpAddress)
    .collect(Collectors.toSet());
List<Server> currrent = ...

List<Server> filtered = current.stream()
    .filter(s -> !primaryIpAddresses.contains(s.getPrimaryIpAddress()))
    .collect(Collectors.toList());