我对Java 8还是陌生的,所以我试图弄清流和过滤器如何与list一起工作。我有一个预定义的字符串列表,并且有一个正在处理的字符串值。如果字符串以预定义列表中的任何字符串开头,我想将处理后的字符串添加到新列表中。如果该字符串与列表中的任何字符串都不匹配,则将其保存到另一个列表中。
例如:
List<String> internalIpAddresses= new ArrayList<>();
List<String> externalIpAddresses = new ArrayList<>();
List<String> ipAddresseses = new ArrayList<String>();
ipAddresses.add("10.");
ipAddresses.add("132.174.");
ipAddresses.add("192.168.");
// filter internal ip addresses
for(String ipAddress : ipAddresseses){
if("10.11.12.13".startsWith(ipAddress)) {
internalIpAddresses.add("10.11.12.13");
}
}
// filter external ip addresses
for(String ipAddress : ipAddresseses){
if(!"5.6.7.8".startsWith(ipAddress)) {
externalIpAddresses .add("5.6.7.8");
}
}
结果:
internalIpAddresses: 10.11.12.13
externalIpAddresses : 5.6.7.8
有没有一种方法可以使用Java 8中的流以更简单的方式实现?
赞:
ipAddresseses.stream()
.filter(ipAddress -> clientIpAddress.startsWith(ipAddress)
.*if the clientIpAddress starts with any of the values in the list then add to internalIpAddresses List
.*if clientIpAddress doesn't start with any values in list then add to externalIpAddresses List
最后,我要保存clientIpAddress
(“ 10.11.12.13”或“ 5.6.7.8”),而不是ipAddresses
(“ 10。”或“ 192.168。”)中的值)列表。
答案 0 :(得分:5)
您可以尝试:
ipAddresseses.stream()
.collect(Collectors.partitioningBy(ipAddress -> ipAddress.startsWith("10.11.12.13")));
这将为Map提供两个元素,一个具有ipAddress良好的元素,另一个具有ipAddress错误的元素。
答案 1 :(得分:4)
您可以执行此操作-
ipAddresseses.stream().foreach( ipaddress
-> decideGoodOrBadAndAdd(s);
创建一种方法来检查IP地址的好坏,并将其相应地添加到相应列表中-
public void decideGoodOrBadAndAdd(String
ipaddress){
if("10.11.12.13".startsWith(ipAddress)) {
goodIpAddresses.add(ipAddress);
}
else if(!"5.6.7.8".startsWith(ipAddress)) {
badIpAddresses.add(ipAddress);
}
}
答案 2 :(得分:4)
简单来说,使用流的迭代代码可以表示为:
List<String> ipAddresses = Arrays.asList("10.", "132.174.", "192.168.");
List<String> internalIpAddresses = ipAddresses.stream()
.filter("10.11.12.13"::startsWith)
.map(ipAddress -> "10.11.12.13")
.collect(Collectors.toList());
List<String> externalIpAddresses = ipAddresses.stream()
.filter(ipAddress -> !"5.6.7.8".startsWith(ipAddress)) // I doubt this should be '.filter("5.6.7.8"::startsWith)'
.map(ipAddress -> "5.6.7.8")
.collect(Collectors.toList());
评论中建议的解决此问题的通用方法可以使用:
List<String> internalIpAddresses = Stream.of("10.11.12.13") // can add more addresses
.filter(ip -> ipAddresses.stream().anyMatch(ip::startsWith))
.collect(Collectors.toList());
答案 3 :(得分:1)
您可以使用:
Map<Boolean, List<String>> ipMap = ipAddresses.stream()
.collect(Collectors.partitioningBy(ipAddress -> ipAddress.startsWith("10.")));
goodIpAddresses.addAll(ipMap.get(true));
badIpAddresses.addAll(ipMap.get(false));
这里的地图 ipMap 仅包含两个键,具体取决于partitioningBy()
要获取需要添加到goodIpAddresses
的ip,只需使用键 true ,而要获取badIpAddresses
的ip则使用键 false 。