假设,我有一个恒定数量的集合(例如3个ArrayLists)作为类的成员.现在,我想将所有元素公开给其他类,以便它们可以简单地遍历所有元素(理想情况下,只读).我正在使用guava集合,我想知道如何使用guava iterables/iterators来生成内部集合的逻辑视图,而无需制作临时副本.
我有一个JsonObject名为"mapping"以下内容:
{
"client": "127.0.0.1",
"servers": [
"8.8.8.8",
"8.8.4.4",
"156.154.70.1",
"156.154.71.1"
]
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以得到数组"servers":
mapping.get("servers").getAsJsonArray()
Run Code Online (Sandbox Code Playgroud)
现在我想解析JsonArray成java.util.List...
最简单的方法是什么?
我正在编写一个代码生成工具来使用Spring-Data-Jpa为Spring启动应用程序生成后端连接代码,而且我很温和地告诉我CrudRepository中的方法返回Iterable而不是List,因为iterable不能提供足够的功能,但List,所以我正在寻找将iterable转换为列表的最佳方法.
我看到这篇关于将迭代更改为集合的帖子我想知道,为什么不将它转换为List,而不是使用像Guava这样的库或实现我自己的函数来进行转换?这样做我不知道有什么问题吗?
编辑:我问,因为它是一个代码生成工具,使它生成引入第三方库依赖的代码是不合理的,编写我自己的函数来进行转换也不合理,因为它必须住在某个地方而且我宁愿在生成的代码中没有它.一个简单的演员会有用,如果有点难看,但只是想知道是否有我遗失的东西?
我有一个难题,这让我思考是否有任何标准的java类在Iterable<T>没有实现的情况下实现Collection<T>.我正在实现一个接口,它要求我定义一个接受一个的方法Iterable<T>,但我用来支持这个方法的对象需要一个Collection<T>.
这让我做了一些真正的kludgy感觉代码,在编译时会给出一些未经检查的警告.
public ImmutableMap<Integer, Optional<Site>> loadAll(
Iterable<? extends Integer> keys
) throws Exception {
Collection<Integer> _keys;
if (keys instanceof Collection) {
_keys = (Collection<Integer>) keys;
} else {
_keys = Lists.newArrayList(keys);
}
final List<Site> sitesById = siteDBDao.getSitesById(_keys);
// snip: convert the list to a map
Run Code Online (Sandbox Code Playgroud)
更改生成的集合以使用更通用的Collection<? extends Integer>类型不会消除该行的未经检查的警告.此外,我无法更改方法签名以接受Collection而不是Iterable因为它然后它不再覆盖超级方法,并且在需要时不会被调用.
目前似乎没有被周围的方式该铸造或拷贝的问题:其他问题都得到了一个在别处问这里,似乎深深扎根于Java的泛型和类型擦除系统.但我要问的是,是否有任何可以实现的类Iterable<T>还没有实现Collection<T>?我已经浏览了IterableJavaDoc,当然我希望传递给我的界面的所有内容实际上都是一个集合.我想使用一个在野外预编写的类,因为它似乎更有可能实际作为参数传递,并使单元测试更有价值.
由于我正在写的一些单元测试,我确定我编写的演员或复制位与我在项目中使用它的类型一起工作.但我想编写一个单元测试的一些输入端,是一个可迭代但不是一个集合,到目前为止,所有我已经能够拿出正在实施一个虚拟的测试类实现自己.
好奇的是,我正在实现的方法是Guava CacheLoader<K, V>.loadAll(Iterable<? …
我想用Iterable初始化Java中的Set Implementation(HashSet).但是,HashSet的构造函数不接受Iterables,而只接受Collections类型的对象.
有没有办法从Iterable转换为某些子集类型.
我想要这样的东西:
public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
List<Foo> fooList = new ArrayList<Foo>();
fooList.addAll(fooIterator);
}
Run Code Online (Sandbox Code Playgroud)
这相当于:
public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
List<Foo> fooList = new ArrayList<Foo>();
while(fooIterator.hasNext())
fooList.add(fooIterator.next());
}
Run Code Online (Sandbox Code Playgroud)
API中是否有任何方法可以实现,或者这是唯一的方法吗?
据我所知,Java 8引入了一种可用于Collection类型的新方法:removeif()。它接受一个谓词,该谓词定义了应删除元素的条件。它返回一个布尔值,其中“真”响应表示已删除至少一个项目,否则返回“假”:我有此类:
HotelPriceSummary {
Hotel hotel;
float price
}
Run Code Online (Sandbox Code Playgroud)
一种 List<HotelPriceSummary> allHotels;
和 Iterable<Hotel> discardedHotels
我想做类似的事情(显然,existIn是一个不存在的函数,是表达我想做的事情,但我没有找到方法)
allHotels.removeIf(h -> h.getHotel().existsIn (discardedHotels))
Run Code Online (Sandbox Code Playgroud)