繁体   English   中英

java.util.stream.Collector的用法

[英]Usage of java.util.stream.Collector

我列出了机器的所有可用IP。 这是一项琐碎的任务,但我正在尝试使用lambda表达式。 我这样做是:

ArrayList<String> ips = new ArrayList<>();

StreamUtils.enumerationAsStream(NetworkInterface.getNetworkInterfaces()).filter(networkInterface -> {
    try {
        return networkInterface.isUp();
    } catch (Exception ignore) {
    }           

    return false;
}).forEach(networkInterface -> {
    StreamUtils.enumerationAsStream(networkInterface.getInetAddresses()).filter(inetAddress -> {
        return !inetAddress.isLoopbackAddress() & inetAddress instanceof Inet4Address;
    }).forEach(inetAddress-> {
        ips.add(inetAddress.getHostAddress());
    });
});

有什么方法可以使用Collector或更好的方法?

StreamUtils#enumerationAsStream为:

public static <T> Stream<T> enumerationAsStream(Enumeration<T> e) {
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(new Iterator<T>() {
        public T next() {
            return e.nextElement();
        }

        public boolean hasNext() {
            return e.hasMoreElements();
        }
    }, Spliterator.ORDERED), false);
}

您应该可以使用Stream.flatMap

返回一个流,该流包括将流中的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容而得到的结果

这样,您可以将NetworkInterfaces流转换为InetAddresses流,然后可以对其进行过滤,映射和收集:

networkInterfaceStream.flatMap(networkInterface -> StreamUtils.enumerationAsStream(networkInterface.getInetAddresses()))
        .filter(inetAddress -> { ... })
        .map(inetAddress -> inetAddress.getHostAddress())
        .collect(Collectors.toList());

当处理可能引发检查异常的方法时,使用实用程序方法实现所需的处理会很有帮助,例如,重新抛出包装在未检查异常中的异常,或者如您所愿,实现拒绝过滤器行为:

interface ThrowingPredicate<T> {
    boolean test(T t) throws IOException;
}
public static <T> Predicate<T> guard(ThrowingPredicate<T> p) {
    return (x) -> {
        try { return p.test(x); } catch(IOException ex) { return false; }
    };
}

使用此辅助方法,您可以按以下步骤执行流操作:

List<String> ips =
    StreamUtils.enumerationAsStream(NetworkInterface.getNetworkInterfaces())
      .filter(guard(NetworkInterface::isUp)
         .and(guard(nif-> !nif.isLoopback())))
      .map(NetworkInterface::getInetAddresses)
      .flatMap(StreamUtils::enumerationAsStream)
      .filter(inetAddress -> inetAddress instanceof Inet4Address)
      .map(InetAddress::getHostAddress)
      .collect(Collectors.toList());

通过研究以上操作,您可能会发现到目前为止可能已经错过的多种功能或概念,这些功能或概念可以在将来为您提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM