我甚至不确定这是否可能,但我正在执行一个集合操作,如联合
或交集
,我需要将其转换为列表
以便洗牌列表并将其传递给接受列表
而不是集
的其他方法。因此,我将结果转换为列表
并且一切都很好。但是从探查器中,我看到操作在负载下花费了很长时间,这是因为Guava设置.size()
的方式。它不像普通java集那样是一个常量操作。
下面是代码示例
@Test
void testSet() {
Set<Character> first = ImmutableSet.of('a', 'b', 'c');
Set<Character> second = ImmutableSet.of('b', 'c', 'd');
Set<Character> union = Sets.union(first, second);
List<Character> characters = new ArrayList<>(union);
}
我正在尝试找到将番石榴集
转换为列表
的最快方法。通过挖掘代码,这就是Guava Sets所做的工作https://github.com/google/Guava/blob/master/Guava/src/common/collect/Sets.java#L694。这不是一个恒定的操作,它损害了高负载下的性能。我猜.size
调用是从Java想要将一个新集合复制到一个新列表时开始的,它必须知道创建列表的大小。
抛开“高负载下的性能”这一论点不谈(如果它在您的用例中确实相关的话,我建议使用适当的JMH微基准测试),sets
操作是内存优化的,因此如果您要立即复制数据,您可能希望尝试完全不调用大小的不同方法。
首先,sets.union
返回setview
,该视图具有immutablecopy()
,然后您可以在该视图上调用.aslist()
视图,返回一个不可变的列表(可以将所有操作链接在一起):
@Test
public void testSetCopy() {
Set<Character> first = ImmutableSet.of('a', 'b', 'c');
Set<Character> second = ImmutableSet.of('b', 'c', 'd');
Sets.SetView<Character> union = Sets.union(first, second);
List<Character> characters = union.immutableCopy().asList();
assertThat(characters).containsOnly('a', 'b', 'c', 'd');
}
第二,您也可以考虑在第一时间使用set
,正如Louis提到的:
@Test
public void testMultiset() {
Set<Character> first = ImmutableSet.of('a', 'b', 'c');
Set<Character> second = ImmutableSet.of('b', 'c', 'd');
// here it's ugly but maybe you can collect to set in the first place
ImmutableMultiset<Character> set = ImmutableSet.<Character>builder()
.addAll(first)
.addAll(second)
.build(); // [a, b, c, d]
List<Character> characters = set.asList();
assertThat(characters).containsOnly('a', 'b', 'c', 'd');
}
尽管如此,YMMV,我再次鼓励您在选择任何可读性较差的选项之前先进行微基准测试。
我想为番石榴设个坑(http://pitest.org/)进行突变熟练度测试,但我在尝试运行时出现以下错误。这是我得到的错误: 基本上,要么PIT没有检测到测试,要么测试在PIT中运行不正常,所有测试都失败了。我读了这篇文章:JUnit测试通过,但PIT说套件不是绿色的,我认为“您的代码库是否包含可变静态状态?(例如在单例中)”是问题所在,但我不知道如何修复它。如果测试套件有一些隐藏的顺序依赖关系
问题内容: 我已经由我的用户组成。在数据库查询之后,我正在检索。我想根据第一个ID列表订购此列表。可能不包括某些ID。番石榴对列表进行排序的方式是什么? 问题答案: 使用番石榴的完全“功能性”方式将与 您可以内联声明一个匿名函数,但是我想在一个单独的类中将我的函数声明为静态工厂方法,以获取更简洁的代码(Java的函数声明的详细信息隐藏在实用程序类中): 正如@Arne在评论中提到的那样,可以在Ja
问题内容: 我想对列表中的元素进行分组。我目前正在这样做: 是否有更好的方法来做到这一点,最好使用番石榴? 问题答案: 当然可以,并且使用Guava甚至更容易:)使用: 如果给出具体的用例,将更容易展示它的实际作用。 来自文档的示例: 版画 在您的情况下,如果GroupFunction定义为: 那么它将转换为: 这是Guava示例中可能使用的实现。 最后,在Java 8中,整个片段甚至可以变得更加
问题内容: 刚刚发现了Guava库项目。 这些与GWT兼容吗? 问题答案: 从该页面的介绍性PDF中, 您可以在…上使用这些库。 在JDK 6上 在Android上, 我们认为。需要志愿者来帮助我们进行测试。 在Google App Engine上, 我们认为。需要志愿者来帮助我们进行测试。 在GWT上-参差不齐! 由于GWT的JDK库支持 可能参差不齐,也许是2/3,所以到目前为止,这些库中的东
问题内容: 有一个对象,是否有比列表理解更快,更好或更正确的方法来获取迭代器返回的对象的列表? 问题答案:
问题内容: 我有一个带有参数的方法,该参数可以为NULL。我想将输入的本地副本作为结束。现在,我的代码如下所示: 有没有更清洁的方法可以做到这一点?如果是一个简单的参数,我可以做类似的事情,但是我不确定是否有类似处理集合的事情。 问题答案: 我不明白为什么您不能使用: 您可以使用静态导入保存某些类型的输入,如果您要这样做的话: