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());