タグ付けされた質問 「java」

Javaは人気のある高水準プログラミング言語です。言語自体の使用または理解に問題がある場合は、このタグを使用してください。このタグが単独で使用されることはめったになく、[spring]、[spring-boot]、[jakarta-ee]、[android]、[javafx]、[gradle]、および[maven]と組み合わせて使用​​されることがほとんどです。

2
ラムダコールはどのようにインターフェイスと相互作用しますか?
以下に示すコードスニペットは機能します。ただし、なぜ機能するのかはわかりません。ラムダ関数が情報をインターフェイスに渡す方法のロジックを完全には理解していません。 制御はどこに渡されますか?コンパイラーnは、ループ内のそれぞれとmessage作成されたものをどのように理解していますか? このコードはコンパイルされ、期待される結果が得られます。どうすればいいのか分かりません。 import java.util.ArrayList; import java.util.List; public class TesterClass { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Akira"); names.add("Jacky"); names.add("Sarah"); names.add("Wolf"); names.forEach((n) -> { SayHello hello = (message) -> System.out.println("Hello " + message); hello.speak(n); }); } interface SayHello { void speak(String message); } }

1
ジェネリックメソッドの「違法な」実装:コンパイルエラーが発生しないのはなぜですか?
私はこのシグネチャを持つメソッドを含むインターフェースを持っています: <P extends MergeProperty<T> & RestartApplicant> List<P> loadPropertiesFrom(T p1, T p2); 基本的には、MergePropertyないクラスではありません実装RestartApplicant、そしてRestartApplicant本当にこの問題を理解するために重要ではありません方法を含む機能のインタフェースです。 これが問題です。このインターフェイスを実装するクラスを作成すると、Javaを使用すると、次のコードをコンパイルエラーなしで実行できます。 public class MyImplementation implements MyInterfacePreviouslyDescribed { @Override public List<MergeProperty<MathObject>> loadPropertiesFrom(MathObject p1, MathObject p2) { return Arrays.asList( // some random instances of MergeProperty that do not implement RestartApplicant ); } } 明らかに、私はそこでの実装の制限を尊重していません。このシグネチャが与えられた場合、使用Arrays.asList(...)して返すリストには、を実装する要素を含める必要はありませんRestartApplicant。MergeProperty実装しないでくださいRestartApplicant。したがって、これはおそらくどこかにキャストエラーを引き起こすことになります。 それでも、警告が表示されます: Type safety: The return type …

6
DockerでのGradleビルドが遅い。Gradleビルドのキャッシュ
複数のSpring Bootアプリケーションを一度に実行する必要がある大学のプロジェクトを行っています。 Gradle Dockerイメージでマルチステージビルドを構成してから、openjdk:jreイメージでアプリを実行しました。 ここに私のDockerfileがあります: FROM gradle:5.3.0-jdk11-slim as builder USER root WORKDIR /usr/src/java-code COPY . /usr/src/java-code/ RUN gradle bootJar FROM openjdk:11-jre-slim EXPOSE 8080 WORKDIR /usr/src/java-app COPY --from=builder /usr/src/java-code/build/libs/*.jar ./app.jar ENTRYPOINT ["java", "-jar", "app.jar"] 私はすべてをdocker-composeでビルドして実行しています。docker-composeの一部: website_server: build: website-server image: website-server:latest container_name: "website-server" ports: - "81:8080" もちろん、最初のビルドには時間がかかります。Dockerは依存関係をすべて引き出しています。そして、私はそれで大丈夫です。 今のところすべてが問題なく動作していますが、コードの小さな変更ごとに、1つのアプリのビルド時間は約1分です。 ビルドログの一部: docker-compose up --build …

2
ラムダ-ClassNotFoundException
これが私のコードの外観です。問題の匿名クラスにどのように/なぜexecutorService.submit(work::get)スローするのかは不明ClassNotFoundExceptionです。常に発生するわけではありませんが、この例外が発生すると、回復しないようです。その後の要求は同じ例外で満たされます。誰かがこれを引き起こす原因を知っていますか? 編集:私は、VMセッションでこのメソッドへのすべての呼び出しが機能するか、どれも機能しないことを確認できます-上記の例外のために一部が成功する一方で他は失敗するようなものではありません。 さらに編集:https : //bugs.openjdk.java.net/browse/JDK-8148560はまさに私が経験しているバグですが、再現性がなかったか、レポーターが応答しなかったため、このバグはクローズされました。どういうわけか、ラムダ式の結果である匿名型は、エグゼキュータが式を実行する前にガベージコレクションされているように見えますが、常にそうであるとは限りません。使用中のjdkはopenjdk1.8.0_221です。 package com.ab.cde.ct.service.impl; @Service public class IngestionService { @Autowired private TransactionTemplate transactionTemplate; @Autowired private AsyncTaskExecutor executorService; @Transactional public void ingest(Data data) { Supplier<Optional<String>> work = () -> transactionTemplate.execute(s -> { // actual work on the data object, enclosed in a try/catch/finally }); executorService.submit(work::get); // this is …
8 java  spring  lambda 

1
入れ子関数のビジターパターンを実装する方法
私はAntlrの初心者であり、Antlr4を使用して以下の実装を実行したかったのです。以下の機能を持っています。 1. FUNCTION.add(Integer a,Integer b) 2. FUNCTION.concat(String a,String b) 3. FUNCTION.mul(Integer a,Integer b) そして、私はこのような関数のメタデータを保存しています。 Map<String,String> map=new HashMap<>(); map.put("FUNCTION.add","Integer:Integer,Integer"); map.put("FUNCTION.concat","String:String,String"); map.put("FUNCTION.mul","Integer:Integer,Integer"); 、どこInteger:Integer,Integerを表すInteger戻り値の型があり、入力はaccesptsが機能しているだろうparamsはInteger,Integer。 入力がこのようなものである場合 FUNCTION.concat(Function.substring(String,Integer,Integer),String) or FUNCTION.concat(Function.substring("test",1,1),String) ビジター実装を使用して、マップに格納されている関数メタデータに対して入力が検証されるかどうかを確認したいと思いました。 以下は、私が使用しているレクサーとパーサーです。 レクサーMyFunctionsLexer.g4: lexer grammar MyFunctionsLexer; FUNCTION: 'FUNCTION'; NAME: [A-Za-z0-9]+; DOT: '.'; COMMA: ','; L_BRACKET: '('; R_BRACKET: ')'; パーサーMyFunctionsParser.g4: parser grammar MyFunctionsParser; options { tokenVocab=MyFunctionsLexer; …
8 java  antlr  antlr4 

5
背後に別のウィンドウがある場合、透過的なJavaFXステージがスクロールイベントをキャプチャします
マウスイベントとスクロールイベントの動作は異なります マウスイベント: イベントはmainStageによってキャプチャされます イベントはmainStageによってキャプチャされます イベントはキャプチャされません スクロールイベント: イベントはmainStageによってキャプチャされます イベントは、secondStageによってキャプチャされます。 イベントはキャプチャされません 透過的なsecondStageがスクロールイベントをキャプチャしない方法はありますか? 私のコード: Pane mainPane = new Pane(new Label("Main Stage")); mainPane.setPrefSize(300, 300); mainStage.setScene(new Scene(mainPane)); Stage secondStage = new Stage(); Pane secondPane = new Pane(new Label("Second Stage")); secondPane.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY))); secondPane.setBorder(new Border( new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(2)))); secondPane.setPrefSize(300, 300); secondStage.setScene(new …
8 java  javafx  openjfx 

2
Gradle badass-runtime-pluginおよびProGuard Gradle Plugin
jPackageの前にproguardを実行する方法は? 前書き Gradleプラグインを使用してJavaFxでアプリを開発し、jPackagerでパッケージ化します。また、gradleプラグインを使用します。 私が使用している主なプラグインは次のとおりです。 id 'org.openjfx.javafxplugin' version '0.0.8' id 'org.beryx.runtime' version '1.7.0' id "com.github.johnrengelman.shadow" version "5.1.0" 私の現在のgradleバージョンはgradle-5.6.2-allです 問題の説明 jPackageが機能する前にコードを難読化および最適化するために、どのようにプロガードを使用しますか? proguardタスクを実行できますが、jPackageを実行してもコードが難読化されません。 古いGradleバージョンのチュートリアル(チュートリアル)を見つけましたが、これを現在のプラグインとどのように組み合わせるかわかりません。私はいくつかのコードスニペットを試しましたが、それらはすべてビルドに失敗し、このトピックを機能しないコードの束で乱雑にしたくありません。 私の現在働いているbuild.gradle // 1. Include proguard dependency buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'net.sf.proguard:proguard-gradle:6.2.0' } } plugins { id 'java' id 'application' id 'org.openjfx.javafxplugin' version '0.0.8' …

4
揮発性読み取りを取り除くためにJavaでメモリバリアをエミュレートする
同時にアクセスされるフィールドがあり、何度も読み取られ、めったに書き込まれないと仮定します。 public Object myRef = new Object(); スレッドT1がmyRefを1分に1回別の値に設定し、他のN個のスレッドがmyRefを数十億回連続して同時に読み取るとします。myRefが最終的にすべてのスレッドに表示されることだけが必要です。 簡単な解決策は、AtomicReferenceまたは単にvolatileを次のように使用することです。 public volatile Object myRef = new Object(); ただし、afaikの揮発性読み取りではパフォーマンスコストが発生します。非常に小さいことはわかっていますが、これは実際に必要なものというよりは、私が不思議に思っているようなものです。したがって、パフォーマンスに関係なく、これは純粋に理論的な質問であると想定しましょう。 つまり、質問は次のようになります。書き込みサイトで何かを行うことによって、書き込みがほとんどない参照の揮発性読み取りを安全にバイパスする方法はありますか? いくつか読んだ後、メモリの壁が私が必要とするものであるように見える。したがって、このような構成が存在する場合、私の問題は解決されます。 書く バリアを呼び出す(同期) すべてが同期され、すべてのスレッドに新しい値が表示されます。(読み取りサイトでの永続的なコストがないと、キャッシュが同期されるため、古くなったり、一時的なコストが発生する可能性がありますが、その後は通常のフィールドに戻り、次の書き込みまで続きます)。 そのような構造はJava、または一般にありますか?この時点で私は仕方がありませんが、このようなものが存在する場合、それを維持するはるかに賢い人々によってすでにアトミックパッケージに組み込まれていると思います。(不定期に頻繁に読み取りと書き込みを行う必要はなかったのではないでしょうか?)それで、私の考えに何か問題があり、そのような構成はまったく不可能ですか? いくつかのコードサンプルが同様の目的で「揮発性」を使用し、それが契約前に発生することを利用するのを見てきました。別の同期フィールドがあります。例: public Object myRef = new Object(); public volatile int sync = 0; そしてスレッド/サイトを書く時: myRef = new Object(); sync += 1 //volatile write to emulate barrier これが機能するかどうかはわかりませんが、x86アーキテクチャでのみ機能すると主張する人もいます。JMSの関連セクションを読んだ後、その揮発性書き込みがmyRefの新しい値を確認する必要があるスレッドからの揮発性読み取りと結合されている場合にのみ、動作することが保証されていると思います。(したがって、揮発性の読み取りを取り除きません)。 …

1
プログラムで検出-JREのプレビューモード
Java 11以降、JavaコンパイラとランタイムのPREVIEW-MODEを有効にできます。新しい機能をプレビューすることができます。(JEP 12) java --enable-preview プレビューモードを有効にしてJVMが起動されたかどうかをJava内から検出するにはどうすればよいですか? 意図は、アプリケーション内ステータスページ/ jsonで実行中のコンテナーを説明することです-開発の概要。 これまでのところ、システムプロパティとフラグを調べましたが、どちらにもヒントが含まれていませんでした。

1
JVMによる静的初期化
言語:java バージョン:12.0.2 次の文字列ソースコード: /* @implNote * The actual value for this field is injected by JVM. The static * initialization block is used to set the value here to communicate * that this static final field is not statically foldable, and to * avoid any possible circular dependency during vm …

4
Android Java:ダイアログが閉じたときにダイアログボックスにMainActivityアプリ名が一瞬表示されないようにするにはどうすればよいですか?
私はAndroid開発にかなり慣れていないため、次のことを行う最初の「実際の」アプリケーションを作成しました。 MainActivityを起動します MainActivityは追加データを処理しViewDialog、拡張するを表示しますDialog。ViewDialogには、showDialog()次の設定と表示を行うメソッドがありますDialog。 protected void showDialog(final Activity activity) { dialog = new Dialog(activity); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCancelable(false); dialog.setContentView(dialog_layout); // Set background color of the dialog ConstraintLayout currentLayout = (ConstraintLayout) dialog.findViewById(R.id.Dialog); // setup of views etc ... // Finally dislay `Dialog` dialog.show(); // Method called to start a `DialogTimer` which extends `CountDownTimer` } …

4
Collectors.toMapまたはgroupingByを使用して、マップのマップ操作の結果を収集する
タイプのリストがList<A>あり、マップ操作List<B>で、1つのリストにマージされたすべてのA要素のタイプの集合リストを取得します。 List<A> listofA = [A1, A2, A3, A4, A5, ...] List<B> listofB = listofA.stream() .map(a -> repo.getListofB(a)) .flatMap(Collection::stream) .collect(Collectors.toList()); フラットマップなし List<List<B>> listOflistofB = listofA.stream() .map(a -> repo.getListofB(a)) .collect(Collectors.toList()); タイプのマップとして結果を収集したい Map<A, List<B>>と、これまでに様々にしようとCollectors.toMapか、Collectors.groupingBy望ましい結果を得ることができたオプションはありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.