当前位置: 首页 > 知识库问答 >
问题:

Java 8-使用StartWith从列表中筛选字符串-X,并将字符串-X保存到列表中

文自怡
2023-03-14

我是Java8的新手,试图弄清楚流和过滤器是如何与列表一起工作的。我有一个预定义字符串的列表,我有一个我正在处理的字符串值。如果字符串以预定义列表中的任何字符串开始,我想将处理过的字符串添加到一个新列表中。如果字符串与列表中的任何字符串不匹配,那么将其保存到另一个列表中。

例如:

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”),而不是ipAddress(“10”)中的值或“192.168”。)列表

共有3个答案

燕扬
2023-03-14

你能做到的-

  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);
   }
}
谷涵容
2023-03-14

你可以试试:

ipAddresseses.stream()
 .collect(Collectors.partitioningBy(ipAddress -> ipAddress.startsWith("10.11.12.13")));

这将生成一个包含两个元素的映射,一个元素具有良好的IP地址,另一个元素具有较差的IP地址。

微生曾琪
2023-03-14

简单地说,使用流的迭代代码可以表示为:

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());
 类似资料:
  • 问题内容: 我有一个清单 我正在尝试删除其超字符串已经在列表中的字符串。在这种情况下,结果应为: 我已经写了代码: 但它似乎不起作用。我读过,我们无法在列表上进行迭代时将其删除。因此,副本,而这是我的原始列表。 问题答案: l=[‘abc’,’abcdef’,’def’,’defdef’,’polopolo’] print [j for i, j in enumerate(l) if all(j

  • 所以我知道我可以过滤 JPA中具有findByProperty的特定属性 但是如果我有一组字符串,我如何过滤呢?我不能对一组字符串使用\u属性,因为字符串没有属性? 假设我有以下实体: 和另一个属性为字符串的类: 这是我的存储库:

  • 问题内容: 我想从python中的字符串列表中删除所有空字符串。 我的想法如下: 有没有更多的Python方式可以做到这一点? 问题答案: 我会用: Python 3从返回一个迭代器,因此应包装在对的调用中

  • 我有一个字符串格式的日期列表,如下所示: 我需要以这样的方式映射它,所以我将有一个年份字符串的列表——就像这样: 我的想法是修剪字符串的开头,然后将其附加到新的年份列表中。 最有效的方法是什么?

  • 我想从包含单词Evil(filterString)的数组中删除一些元素。 以下是我从原始阵列(来宾)获得的信息: 只希望客人数组更新一旦所需的字符串(邪恶)被过滤。

  • 嗨,我尝试将以下Source类映射到以下Destation类。我使用了以下映射以将字符串值映射到列表字符串。它没有正确映射。我需要知道如何使用Dozer将2个字符串值映射到一个目标字符串列表中。