Tag: guava

有一种优雅的方法来获取Java中多个方法返回的第一个非null值吗?

你自己已经看过很多次了,我敢肯定: public SomeObject findSomeObject(Arguments args) { SomeObject so = queryFirstSource(args); // the most likely source first, hopefully if (so != null) return so; so = querySecondSource(args); // a source less likely than the first, hopefully if (so != null) return so; so = queryThirdSource(args); // a source less likely than the previous, hopefully if (so […]

Java:用于确定等价的外部类?

Java有一个Comparator用于提供类本身外部对象的比较,以允许进行有序比较的多种/替代方法。 但是,进行无序比较的唯一标准方法是覆盖类中的equals() 。 当我想在课堂外提供多个/备用无序比较时,我该怎么办? (明显的用例是根据特定属性将集合划分为等价类。) 假设最终用途是无序检查(例如不用于排序或索引),是否可以实现仅检查相等性的Comparator ,如果两个对象相等则返回0,并且当两个对象时返回值!= 0是不平等的? ( 注意 :我没有跳过这个解决方案的唯一原因是,从技术上讲,它可以通过不提供满足传递性和对称性的关系来破坏Comparator的合同。) 似乎应该有一个EqualsComparator标准类或类似的东西。 (番石榴会处理这样的事吗?)

使用Commons或Guava将文本文件导入Java List

使用Commons或Guava库将每行文本(从文本文件)放入LinkedList(作为String对象)或其他集合的最优雅方法是什么。

如何在将数据发送到另一个应用程序时实施重试策略?

我正在处理我的应用程序,它将数据发送到zeromq 。 以下是我的应用程序: 我有一个SendToZeroMQ类, SendToZeroMQ数据发送到zeromq。 将相同的数据添加到同一个类中的retryQueue ,以便以后可以在未收到确认的情况下重试。 它使用带有maximumSize限制的guava缓存。 有一个单独的线程从zeromq接收先前发送的数据的确认,如果没有收到确认,则SendToZeroMQ将重试发送相同的数据。 如果收到确认,那么我们将从retryQueue删除它,以便不能再次重试。 想法非常简单,我必须确保我的重试策略正常工作,这样我就不会丢失数据。 这是非常罕见的,但如果我们没有收到acknolwedgements。 我正在考虑构建两种类型的RetryPolicies但我无法理解如何在这里构建与我的程序相对应的: RetryNTimes:在此期间,它将在每次重试之间以特定睡眠重试N次,之后,它将删除记录。 ExponentialBackoffRetry:在此它将指数级地继续重试。 我们可以设置一些最大重试限制,然后它将不会重试并将丢弃记录。 下面是我的SendToZeroMQ类,它将数据发送到zeromq,也从后台线程每30秒重试一次,并启动可持续运行的ResponsePoller runnable: public class SendToZeroMQ { private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5); private final Cache retryQueue = CacheBuilder .newBuilder() .maximumSize(10000000) .concurrencyLevel(200) .removalListener( RemovalListeners.asynchronous(new CustomListener(), executorService)).build(); private static class Holder { private static final SendToZeroMQ INSTANCE = new SendToZeroMQ(); } […]

Guava EventBus中的注释与接口

Guava开发人员选择使用注释: class EventBusChangeRecorder { @Subscribe void recordCustomerChange(ChangeEvent e) { recordChange(e.getChange()); } } …而不是经典界面: class EventBusChangeRecorder implements Handler{ void handle(ChangeEvent e) { recordChange(e.getChange()); } } 这使得编译时检查变得不可能。 所以我想知道这种方法的优点是什么。 你看到注释有什么好处吗?

列出使用double 的RAM的?

Java专家强调避免过早优化的重要性,而是专注于清洁OO设计。 我试图在重写使用大量长元素(几百万)的程序的上下文中调和这个原则。 看起来使用ArrayList会占用long的原始数组的大约3倍的内存,并且浪费那么多RAM似乎是我的合理关注。 我的基础是我使用此处描述的 MemoryTestBench类进行的实验。 我的测试和输出如下: package memory; import java.util.ArrayList; import java.util.List; public class ArrayListExperiment { public static void main(String[] args) { ObjectFactory arrayList = new ObjectFactory() { public Object makeObject() { List temp = new ArrayList(1000); for (long i=0; i<1000; i++) temp.add(i); return temp; } }; ObjectFactory primitiveArray = new ObjectFactory() { public Object […]

比较集合内的集合

我有这样的一套: Set<Set> NestedSet = new HashSet<Set>(); [[Node[0], Node[1], Node[2]], [Node[0], Node[2], Node[6]], [Node[3], Node[4], Node[5]]] 我想比较和合并嵌套集内的集合。 [0,1,2]和[0,2,6]具有共同的要素。 所以应该合并它们形成0,1,2,6。 输出应该是这样的: [[Node[0], Node[1], Node[2], Node[6]], [Node[3], Node[4], Node[5]]] 有没有有效的方法?

Guava不可变表的Java 8收集器

使用案例: 通过返回类型为{R,C,V} ImmutableTable的方法的进程列表。 例如ImmutableTable of {Integer,String,Boolean} process(String item){…} 收集结果,即合并所有结果并返回ImmutableTable 。 有没有办法实现它? 目前的实施(波希米亚建议): 如何使用并行流? 以下代码中是否存在并发问题? 使用Parallel流我在tableBuilder.build()上得到“索引1800处的NullPointerException”,但是对于流工作正常。 ImmutableTable buildData() { // list of 4 AwsS3KeyName listToProcess.parallelStream() //Create new instance via Guice dependency injection .map(s3KeyName -> ProcessorInstanceProvider.get() .fetchAndBuild(s3KeyName)) .forEach(tableBuilder::putAll); return tableBuilder.build(); } 虽然下面的代码非常适合流和并行流。 但是由于row和col的重复输入,ImmutableBuild失败了。 什么是在合并表时防止重复的最佳方法? public static Collector<ImmutableTable, ImmutableTable.Builder, ImmutableTable> toImmutableTable() { return Collector.of(ImmutableTable.Builder::new, ImmutableTable.Builder::putAll, (builder1, builder2) -> […]

Java Hash Multi Map(具有多个值的键)实现

从这里开始 ,我发现Colt的OpenIntIntHashMap和Trove的TIntIntHashMap比Java内置的HashMap或Guava的HashMultimap提供了更好的性能和内存使用。 Colt的OpenIntIntHashMap或Trove的TIntIntHashMap允许具有多个值的键,与HashMultimap ? 如果没有什么是实现可以实现Colt或Trove性能和内存效率的HashMultimap的好方法? 注意:我测试了Guava的HashMultimap ,但它的性能和内存效率对我来说似乎很差。

番石榴,Files.readLines()和空白区域

我有以下代码使用Guava的Files.readLines()方法: List strings = Lists.newArrayList(); final File file = new File(filePath); if (file.isFile()) { try { strings= Files.readLines(file, Charsets.UTF_8); } catch (IOException ioe) {} } else { // File does not exist } 一旦我有了我的String列表,我想测试一下,看看我正在查看的当前字符串是否在文件中。 String myString = “foo”; if (strings.contains(myString)) { // Do something } 但是,我想使容忍原始文件的代码包含前导或尾随空格(即” foo ” )。 实现这一目标的最优雅方式是什么?