問題タブ [guava]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - InputStream をリーダーとして開く
GuavaInputStream
を使用するように簡単に変換できますか?BufferedReader
私は次のようなものを探しています:
を使用してファイルを開くことができますFiles.newReader(File file, Charset charset)
。それはクールです。私はInputStream
.
アップデート:
使用CharStreams.newReaderSupplier
は私にとって冗長に思えます。私が間違っている場合は修正してください。ただし、Guava を使用InputStream
するように簡単に変換するには、次のようにする必要があります。BufferedReader
もちろん、次のようなヘルパーを作成できます。
しかし、そのようなヘルパーは Guava IO によって提供されるべきだと思います。File インスタンスに対してそのようなトリックを行うことができます。InputStream を使用できないのはなぜですか?
私が間違っている場合は修正してください。ただし、API が不足しているように思えます。
guava - 述語を使用して変換されたコレクションから要素を削除するには?
と がある場合ArrayList<Double> dblList
、次の使用Predicate<Double> IS_EVEN
からすべての偶数要素を削除できます。dblList
dblList
ただし、次のような変換の結果である場合
変換されたリストは不変であるため、これはもはや機能しません:-)
解決策はありますか?
java - コンピューティング マップ: 事前に値を計算する
高価な計算の結果をキャッシュするために使用しているコンピューティング マップ(ソフト値) があります。
ここで、特定のキーが次の数秒以内に検索される可能性が高いことがわかっている状況があります。そのキーは、ほとんどのキーよりも計算コストも高くなります。
最小優先度のスレッドで値を事前に計算して、値が最終的に要求されたときに既にキャッシュされているようにして、応答時間を改善したいと思います。
次のようにこれを行う良い方法は何ですか:
- 計算が実行されるスレッド (具体的にはその優先度) を制御できます。
- 重複作業が回避されます。つまり、計算は 1 回だけ実行されます。計算タスクが既に実行されている場合、呼び出し元のスレッドは、値を再度計算する代わりにそのタスクを待機します (
FutureTask
これを実装します。Guava の計算マップでは、呼び出しのみの場合は true ですがget
、呼び出しと組み合わせた場合は異なりますput
。) - 「事前に値を計算する」方法は、非同期で冪等です。計算がすでに進行中の場合は、その計算が完了するのを待たずにすぐに戻る必要があります。
- 優先度の逆転を回避します。たとえば、優先度の高いスレッドが値を要求し、優先度が中程度のスレッドが無関係なことを行っているが、計算タスクが優先度の低いスレッドでキューに入れられている場合、優先度の高いスレッドを飢えさせてはなりません。おそらくこれは、計算スレッドの優先度を一時的に上げたり、呼び出しスレッドで計算を実行したりすることで実現できます。
関連するすべてのスレッド間でこれをどのように調整できますか?
追加情報
私のアプリケーションでの計算は画像フィルタリング操作です。つまり、すべて CPU バウンドです。これらの操作には、アフィン変換 (50 マイクロ秒から 1 ミリ秒までの範囲) と畳み込み (最大 10 ミリ秒) が含まれます。もちろん、さまざまなスレッドの優先度の有効性は、OS がより大きなタスクをプリエンプトする能力に依存します。
guava - MapMaker を使用してキャッシュを作成する
MapMaker を使用して、大きなオブジェクトをキャッシュするマップを作成したいと考えています。これは、十分なメモリがない場合はキャッシュから削除する必要があります。この小さなデモ プログラムは問題なく動作するようです。
ただし、実際のアプリケーションで同じことを行うと、エントリは基本的に追加されるとすぐにキャッシュから削除されます。私の実際のアプリケーションでは、整数もキーとして使用します。キャッシュされた値は、データを含むディスクから読み取られたアーカイブ ブロックです。私が理解している限り、弱参照は使用されなくなるとすぐにガベージコレクションされるため、キーが弱参照であるため、これは理にかなっているようです。次のようにマップを作成すると:
エントリがガベージ コレクションされることはなく、テスト プログラムでメモリ不足エラーが発生します。TestValue エントリの finalize メソッドは呼び出されません。テスト方法を次のように変更すると:
エントリがキャッシュから削除され、TestValue オブジェクトのファイナライザーが呼び出されますが、しばらくするとメモリ不足エラーも発生します。
私の質問は、MapMaker を使用してキャッシュとして使用できるマップを作成する正しい方法は何ですか? weakKeys を使用すると、テスト プログラムができるだけ早くエントリを削除しないのはなぜですか? キャッシュ マップに参照キューを追加することはできますか?
java - ConcurrentHashMap に格納されたアトミック インクリメント カウンター
Web アプリのさまざまな場所からいくつかのメトリックを収集したいと考えています。簡単にするために、これらはすべてカウンターになるため、唯一の修飾子操作はカウンターを 1 増やすことです。
増分は同時に頻繁に行われます。読み取り (統計のダンプ) はまれな操作です。
ConcurrentHashMapを使用することを考えていました。問題は、カウンターを正しくインクリメントする方法です。マップには「インクリメント」操作がないため、最初に現在の値を読み取り、新しい値をマップに入れるよりもインクリメントする必要があります。これ以上のコードがなければ、これはアトミック操作ではありません。
同期なしでこれを達成することは可能ですか (これはConcurrentHashMapの目的を無効にします)? Guavaを見る必要がありますか?
ご指摘ありがとうございます。
PS SO ( Java で Map 値をインクリメントする最も効率的な方法
) に関する関連する質問がありますが、マルチスレッドではなくパフォーマンスに焦点を当てています
更新
同じトピックを検索してここにたどり着いた人のために: 以下の回答に加えて、偶然にも同じトピックをカバーする便利なプレゼンテーションがあります。スライド 24 ~ 33 を参照してください。
java - Google Guava と私が理解できないエラー
コンパイルしようとすると、次のエラーが発生します。
タイプ Iterablesのメソッドfilter(Iterable<T>, Predicate<? super T>)
は引数に適用できません ( Iterator<PeopleSoftBalance>, ColumnLikePredicate<PeopleSoftBalance>
)
ColumnLikePredicate クラス sig は次のとおりです。
私は何を間違っていますか?
java - IllegalAnnotationsException SetMultimap はインターフェースであり、JAXB はインターフェースを処理できません
次のコードがあります。
これにより、次の例外が発生します。
私の質問は、なぜこれが機能しないのかということですが、これは機能します:
また、JAXB が満足するように SetMultimap を修正するにはどうすればよいでしょうか?
java - Guava ForwardingList の使用例
Guava ForwardingList クラスを説明するサンプル コードを探しています。基本的に、以前の SO questionで述べたこの要件を解決するために使用されるカスタム ArrayList クラスを実装しています。以前に Google コレクションを使用したことはありません。しかし、ForwardingList のJavaDoc を見るだけで、ForwardingListをサブクラス化することでカスタム クラスを実装できると思います。
java - リフレクションを使用して、可能な場合はオブジェクトのデフォルトを自動入力します
これは、主にJUnitのオブジェクトファクトリのために、オブジェクトのフィールドに怠惰に入力するために私がいじくり回してきたコードですが、これは非常に便利な方法である可能性があります。
このコードをオブジェクトで実行すると、次の例外が発生します。
m.invoke( "");を実行すると例外が発生します。文字列セッター。
googlersの利益のためにソースコードを更新しました。
java - guava-libraries-Orderingクラスのスレッドは安全ですか?
guava -librariesにはOrderingクラスがあります。スレッドセーフかどうか疑問に思います。
たとえば、静的変数として使用できますか?