Java 8 - 使用startsWith从列表中过滤字符串-X并将String-X保存到列表中

AMa*_*gic 7 java java-8 java-stream

我是Java 8的新手,并试图了解流和过滤器如何与列表一起工作.我有一个预定义的字符串列表,我有一个我正在处理的字符串值.如果字符串以预定义列表中的任何字符串开头,我想将处理后的字符串添加到新列表中.如果字符串与列表中的任何字符串都不匹配,则将其保存到另一个列表中.

例如:

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");
     }
}
Run Code Online (Sandbox Code Playgroud)

结果:

internalIpAddresses: 10.11.12.13
externalIpAddresses : 5.6.7.8 
Run Code Online (Sandbox Code Playgroud)

有没有办法在java 8中使用stream以更简单的方式实现?

喜欢:

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
Run Code Online (Sandbox Code Playgroud)

最后我想保存clientIpAddress("10.11.12.13"或"5.6.7.8"),而不是ipAddresses("10."或"192.168.")列表中的值.

Nam*_*man 7

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

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());
Run Code Online (Sandbox Code Playgroud)

解决此问题的评论中建议的一般方法可能是使用:

List<String> internalIpAddresses = Stream.of("10.11.12.13") // can add more addresses
        .filter(ip -> ipAddresses.stream().anyMatch(ip::startsWith))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 这是处理单个项目的奇怪方式。当将这些项目视为通用代码的特例时,使用更有意义,例如`List&lt;String&gt; internalIpAddresses = Stream.of("10.11.12.13").filter(ip -&gt; ipAddresses.stream ().anyMatch(prefix -&gt; ip.startsWith(prefix)).collect(toList());`,它允许插入更多地址以供操作检查。 (4认同)

fas*_*ava 5

你可以试试 :

ipAddresseses.stream()
 .collect(Collectors.partitioningBy(ipAddress -> ipAddress.startsWith("10.11.12.13")));
Run Code Online (Sandbox Code Playgroud)

这将为Map提供两个元素,一个具有良好的ipAddress,另一个具有错误.


Rah*_*hak 5

你可以这样做 -

  ipAddresseses.stream().foreach( ipaddress 
 -> decideGoodOrBadAndAdd(s);
Run Code Online (Sandbox Code Playgroud)

创建一种方法来检查它的 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);
   }
}
Run Code Online (Sandbox Code Playgroud)