使用Java 8流解析字符串

3

我有一个IP地址字符串,像"192.168.1.1"。是否可以使用Java 8流解析字符串,并获得原始的字节数组作为结果?目前我有以下代码:

Arrays.stream(address.split("\\."))
      .map(UnsignedBytes::parseUnsignedByte)
      .toArray(Byte[]::new);

UnsignedBytes是guava类中返回byte的类,但是这段代码返回的是Byte[]而不是byte[]。

更新: 是的,我已经了解过为什么ByteStream类不存在。 我的问题是,是否可能使用Java 8流获取字节数组,而无需创建中间列表等额外开销。


我能想到的唯一方法就是编写一个自定义收集器。这可能可行,但可能会有些棘手。 - Louis Wasserman
你可以将数据收集到一个列表中,然后使用Guava的Bytes.toArray方法获取一个原始数组。 - Hank D
请看此答案中的最终collect:http://stackoverflow.com/a/36613808/3487617 - Hank D
1
坦白地说,这是一项有趣的智力努力,但这种情况下,一个简单的for循环更简单易读。而且你也不能并行化这个流,所以它甚至没有这个优势。 - JB Nizet
2个回答

3

你可以使用Java的InetAddress类。

 InetAddress i = InetAddress.getByName("192.168.1.1");
 byte[] bytes = i.getAddress();

1
我喜欢这个答案,但是javadoc说结果以网络字节顺序呈现:地址的最高位字节在getAddress()[0]中。我认为你需要反转字节数组以适应OP的需求。 - Bohemian
@Bohemian 不确定OP想要什么顺序。上面的代码在bytes[0]中有192,在bytes[1]中有168,依此类推。这对我来说很有意义。 - Robert
我一定是在思考位(其中0是“最后”一位)。这很好! - Bohemian

1
你可以使用 Pattern.splitAsStream(CharSequence),在收集器中使用 ByteArrayOutputStream
byte[] bytes = Pattern.compile("\\.")
        .splitAsStream(address)
        .mapToInt(Integer::parseInt)
        .collect(
                ByteArrayOutputStream::new,
                ByteArrayOutputStream::write,
                (baos1, baos2) -> baos1.write(baos2.toByteArray(), 0, baos2.size())
        )
        .toByteArray();

https://dev59.com/M1wY5IYBdhLWcg3wlolg#32470838收集适应的代码。


1
我更喜欢这个答案,因为它符合问题的主题,并且在仅解析IP地址之外也很有用。 - lscoughlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接