UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

Java

【Java】オフセット付きの日時

Postgresqlに日時のデータを保存する場合、全ての時間帯付きの日付と時刻は UTC で内部的に保存される そこで、データベースとアプリケーション間の日時の整合性を保つために、Javaアプリで扱う日時も UTC で固定したい Javaでオフセット(時差)付きの日時…

【Java】@PostConstructをつけてBean構築後にクラスで1度だけ実行される事前処理を行う

コンポーネントスキャンしてDIコンテナにBeanを登録する際、Bean構築後にクラスで1度だけ実行される事前処理を行いたい この時、@PostConstructをつけるとよいことを知った docs.oracle.com 以下のように該当メソッドに@PostConstructをつければ良い @Compo…

【Java】Lombokの@SneakyThrows を使用した場合、lombok.jarはクラスパスに必要になるかどうか

Lombokの@SneakyThrows はチェック例外を非チェック例外にして投げ直してくれる機能 projectlombok.org チェック例外は try - catch で捕獲する必要がありコードが若干冗長になってしまう、そこで@SneakyThrowsを使うとチェック例外を非チェック例外のように…

【Java】Path.resolveを使ってパスを結合する

2つのパスを結合したい時にはPath.resolveを使えば良いことを知った docs.oracle.com Path.resolveの簡単な使い方 Path path1 = Paths.get("/Users/user/Documents"); Path path2 = Paths.get("file.txt"); Path resolvedPath = path1.resolve(path2); Syst…

【Java】リストを指定の数で分割したい

最大で1,000要素になる可能性があるリストで、もし800要素以上ある場合は800要素以下のリストと残りの要素のリストに分けたい これはJavaでどうするんだっけ?と思ったので調べた List.subList を使う List.subListというのがあったので、普通にこれを使うの…

【Java】GCSのファイルをローカルにダウンロードする

Javaライブラリであるgoogle-cloud-storageを使うと、BlobクラスのdownloadToメソッドを使用して、GCSバケット内のオブジェクト(Blob)をローカルにダウンロードできる cloud.google.com 使い方は以下のような感じ import com.google.cloud.storage.Blob; i…

【Spring Boot】@Asyncアノテーション

Javaのアプリケーションで非同期処理を実装して、パフォーマンスを向上したい この時@Asyncアノテーションを知ったので調べた @Asyncアノテーションは、JavaのSpring Bootフレームワークで非同期処理を実装する際に使用される これを使用すると、メソッドが…

【Mockito】RestHighLevelClientのモック化

JavaのElasticsearchクライアントライブラリRestHighLevelClientをMockitoでモック化したかったが単純ではなかった 通常、Mockitoでモックする場合は以下のようにするだけ RestHighLevelClient esClient = mock(RestHighLevelClient.class); when(esClient.m…

【Java】コレクションの中からBigDecimal型のプロパティが最小であるものを求める

Javaのstreamを使ってコレクションの中から最小値を求めたい なんとなくminを使えば?と思って以下のようにしてみたが上手くいかなかった class Product { public BigDecimal price; } List<Product> products; products.stream().min((Product) p -> p.price); javad</product>…

【Java】ライブラリを使わず反復処理でインデックスを取得したい

JavaのVavrという関数型ライブラリを使っていたときに、反復処理でインデックスを使いたい場合はzipWithIndexというのを使っていた uga-box.hatenablog.com ただ、いまはVavrを使うのをやめており、使わないでインデックスが必要なときにどうするか調べた こ…

【Java】いまさらJava9で追加されたflatMap(Optional::stream)を知った

Java9で追加されたflatMap(Optional::stream)という関数を知ったのでメモ docs.oracle.com これはOptionalオブジェクトが保持する値が非nullの場合はその値だけを持つstreamを返し、nullの場合は空のstreamを返す関数 今まではfilter(Optional::isPresent).m…

【Java】TestContainersを使ってDBアクセスを含むテストを行う

JavaでDBのアクセスを含むテストを書くときにTestContainersというライブラリが便利だと知ったので調べた TestContainersは、JUnitのテストをサポートするJavaのライブラリで、Dockerコンテナ上でDBやSelenium web browserなどを起動することができます。 ww…

【Java】デフォルトコンストラクタをprivateにしてたらObjectMapperでデシリアライズが失敗した

JacksonのObjectMapperを使って、あるオブジェクトをデシリアライズしようとしたところ「ofコンストラクタが見つからない」というエラーが発生してでシリアライズが失敗した 原因はわからないままだが、やったことをメモ 失敗したクラスは以下 @Value public…

【Java】Lombokでつくったインスタンスをcloneしたい

Lombokを使っていて、あるクラスに@BuilderをつけてBuilderパターンでインスタンス生成した projectlombok.org このインスタンスをcloneして、あるプロパティの値だけを上書きしたくなったので方法を調べた @Builder(toBuilder = true) @Builderのアノテーシ…

【Spring Boot】AutoConfigureで特定のライブラリがクラスパス上に存在する場合に適用するようにしたい

Spring BootのAutoConfigureでライブラリを作る際に、特定のライブラリがクラスパス上に存在する場合にBean定義した設定を適用するようにしたい AutoConfigureとは 3rdパーティライブラリなどに対して、ある設定をした上でSpring上で利用したい場合に、それ…

【Spring Boot】@Configurationアノテーションの(proxyBeanMethods = false)とは

Springの以下のアノテーションの使い方がわからなかったので調べた @Configuration(proxyBeanMethods = false) これはBean Lite Modeと呼ばれるものらしく、CGLIB proxy を明示的に利用せずBean登録する設定らしい CGLIBとは、プログラムのコンパイル後にク…

【GAE】AppEngineサーバーの一時ファイル置き場

GCSにあるファイルを取得してそのままStreamとして使ったときにOutOfMemoryが発生した 一つの対策案としてGCSにあるファイルを一度AppEngineのサーバーのローカルに置いて、そのローカルのファイルを読んで使うとどうなるかという案がでたので試したい この…

【Java】GCSからjsonファイルを取得してstreamにする

JavaでGCSにあるファイルを取得してStreamにしたい 公式ドキュメントだとファイルを特定のフォルダにダウンロードする方法が紹介されている cloud.google.com これをファイルダウンロードせずにStreamにする方法を調べた com.google.cloud.storage.Blobクラ…

【Java】GCSからjsonファイルをダウンロードする

JavaでGCSにあるファイルをダウンロードする 公式ドキュメントを参考にする cloud.google.com import com.google.cloud.storage.Blob; import com.google.cloud.storage.BlobId; import com.google.cloud.storage.Storage; import com.google.cloud.storage.…

【Java】リストを指定した件数ずつに分割する

Javaで数万件の要素をもつリストを1000件ずつのリストに分割したい いわゆるパーティションというやつだが、Javaの標準ライブラリにはないみたい こちらを参考にしたところ、いくつかやり方があるみたいだが外部ライブラリは極力いれたくない www.baeldung.c…

【Java】VavrのTupleに変わるもの

前まで VavrというJavaの関数型ライブラリを使っていたが、いまはそれをやめている ただVavrの Tupleというクラスが便利だったので、いまの環境でやれないか調べた Spring frame work(org.springframework.data.util.Pair) SpringにPairというライブラリが…

【Java】スレッドセーフ

以前ConcurrentHashMapについて調べた時にJavaのスレッドセーフについてちゃんと説明できないと思ったので調べた 【Java】HashMapとConcurrentHashMap - UGA Boxxx ちょっと古いけどこちらの本の第二章を参考にした Java並行処理プログラミング ―その「基盤…

【Java】MapStructのMappingアノテーション内で式を使わなくてもよかった

以前にMapStructのMappingアノテーション内で式を使ってオブジェクト間のマッピング処理を行なったが、そんなことを書かずともMapStructで実現できた 以前の記事 uga-box.hatenablog.com 例としてあげたのは下のようなプロパティをもつDTOを private BigDeci…

【Java】HashMapとConcurrentHashMap

Javaで書かれた人のコードをみていてConcurrentHashMapを使っているのを見つけた HashMapの同期化には問題があるのは頭の片隅にはあったが、Javaを普段書かないので、なにが問題なのか、ConcurrentHashMapとの違いが自分の中で説明ができなかったので調べる…

【Java】Java17がリリースされたのでキャッチアップ

9月にJava17がリリースされた Java11あたりからのアップデートが滞っていたのでキャッチアップしたい そんなとき、Java女子部イベントの資料が丁度よかったのでこちらを参考にさせてもらった speakerdeck.com 知らなかったことだけ JEP 361: Switch Expressi…

【Java】Javaでハッシュ値を生成する

Javaである検索条件に対する結果オブジェクトをjsonにしてGCSに格納する このときファイル名を検索条件をハッシュ化したものにしたい Javaでのハッシュ値の生成の方法を調べた Javaでハッシュ値を生成 Javaでハッシュ値を生成するには、Javaの標準機能である…

【Java】GCSにjsonファイルをアップロードする

すでにSpring BootでGCSにjsonファイルをアップロードする機能を実装していて動作確認済みなのだが、のちのち見つけた下の公式ドキュメントの方法と微妙にやり方がちがったので、どちらがよいのかを調べた ドキュメントは以下 cloud.google.com 実装したClou…

【Java】Java Bean Mappingライブラリ

Java Bean間のマッピングにMapStructを使っている uga-box.hatenablog.com 他にどんなものがあるのか気になっていたが、下の記事にまとまっていたので、これをもとに自分でもまとめてみた www.baeldung.com Dozer https://github.com/DozerMapper/dozer#what…

【Java】実行時間の計測

Javaで処理の実行時間を調べたい ZonedDateTime.now()でstartとendを算出し、ChronoUnitでその間の時間をだすようにするのがよさそう https://docs.oracle.com/javase/jp/8/docs/api/java/time/ZonedDateTime.html https://docs.oracle.com/javase/jp/8/docs…

【Java】joinメソッドで文字列を連結する

普段Javaを触らないので、いまさらJavaのjoinメソッドをしった Java8で追加されたAPIで、Java7以前では以下のような書き方をしていたが List<String> stringList = new ArrayList<>(); stringList.add("foo"); stringList.add("bar"); stringList.add("baz"); Spring</string>…