gpt4 book ai didi

java - 处理 Set 的元素并使用流创建 Set

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:28 24 4
gpt4 key购买 nike

我有一个 Set<String>"hostname:port"对,然后我想创建一个 Set<InetSocketAddress> .我这样试过:

Set<InetSocketAddress> ISAAddresses = StrAddresses
.stream().map(addr -> new InetSocketAddress(
addr.split(":")[0],
Integer.parseInt(addr.split(":")[1])));

但这会在 IntelliJ 中产生以下错误:

Incompatible types. Required Set<InetSocketAddress> but 'map' was inferred to Stream<R>: no instance(s) of type variable(s) R exist so that Stream<R> conforms to Set<InetSocketAddress>

我使用 map 和 lambda 的方式一定有问题。

最佳答案

Stream#map函数不返回 Map .它将流的当前元素转换(映射)为其他元素。所以它从 Stream<X> 生成一个Stream<Y>使用给定的转换函数,它采用X并输出 Y .

StrAddresses.stream()                           // String
.map(addr -> new InetSocketAddress(
addr.split(":")[0],
Integer.parseInt(addr.split(":")[1]))); // InetSocketAddress

您从 Stream<String> 开始最后得到 Stream<InetSocketAddress> .

引自其documentation :

Returns a stream consisting of the results of applying the given function to the elements of this stream.


如果您想将该流转换为 Set你需要使用 Stream#collect像这样的方法:

StrAddresses.stream()
.map(addr -> new InetSocketAddress(
addr.split(":")[0],
Integer.parseInt(addr.split(":")[1])))
.collect(Collectors.toSet());

实用方法Collectors.toSet()返回优化良好的收集器 Set .例如,如果您明确想要 HashSet你可以改用这个:

.collect(Collectors.toCollection(HashSet::new));

来自其documentation :

Performs a mutable reduction operation on the elements of this stream. A mutable reduction is one in which the reduced value is a mutable result container, such as an ArrayList [...]


请注意,您目前每次将同一元素拆分两次:

addr.split(":")[0],                     // First
Integer.parseInt(addr.split(":")[1]))) // Second

您可以节省额外的 split通过记住之前的值的过程。在这种情况下,这可以通过使用第二个 Stream#map 来优雅地完成。称呼。首先我们从 Stream<String> 转换而来至 Stream<String[]>然后到Stream<InetSocketAddress> :

StrAddresses.stream()                                 // String
.map(addr -> addr.split(":")) // String[]
.map(addrData -> new InetSocketAddress(
addrData[0], Integer.parseInt(addrData[1]))) // InetSocketAddress
.collect(Collectors.toSet());

请注意 Stream#map是一个惰性操作。这意味着 Java 不会转换整个 Stream来自 AB一旦你调用了这个方法。它会等到非惰性(完成)操作,如Stream#collect来,则遍历Stream并应用每个惰性操作逐元素。所以你可以添加尽可能多的Stream#map在整个 Stream 上随心所欲地调用而不产生额外的循环 .

关于java - 处理 Set<Foo> 的元素并使用流创建 Set<Bar>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com