JAVA関連のことを調べてみた2023年07月26日

JAVA関連のことを調べてみた2023年07月26日

RestTemplateで外部のWeb APIにアクセスするクラスのテストを、MockRestServiceServerを使って書く

# やりたいこと
Springの`RestTemplate`で外部のWeb APIにアクセスするクラスのテストを書きたいです。しかしその場合、アクセス先のサーバーをどうやって用意するかが問題になります。

[WireMock](https://wiremock.org/)など、モックサーバーを用意するためのライブラリも存在します(個人的には使ったことないので詳しくは分かりません)。

今回はSpringで用意されている`MockRestServiceServer`を使ってみます。`MockRestServiceServer`は名前の通りモックサーバー機能を持つクラスです。`RestTemplate`と連携することができます。

# 環境
– JDK 17
– Spring Boot 3.1.2

# サンプルコード
https://github.com/MasatoshiTada/mock-rest-service-server-sample

# Web APIの仕様
## GET /api/hello
ステータスコード200、レスポンスボディは下記

“`json:レスポンスボデ

元記事を表示

[Java] 文字列の連結

# 文字列の連結とは
* 2つ以上の文字列をつなげること
* 文字列の連結(concatenation)
“`java:例
String s = “日本語で” + “あそぼ”;
“`
* +演算子を使用する他にも連結する方法はある
* しかもその方が圧倒的に処理速度が高速
# +演算子が遅い理由
* Stringインスタンスが保持する文字列情報は、インスタンス化した際に初期化され、以後`二度と変化しない`
* 例えば「s = s + “World”;」が実行されたとして、String型変数sのサイズが大きくなり「”HelloWorld”」とはならない
* +演算子による連結が行われた瞬間、`古いインスタンスは捨てられ`連結後の情報を持つ`新しいインスタンがnewにより生成`、格納される
* 結果、+演算子による数万回の文字列連結は内部で数万回newすることを意味する(だから遅い)
# StringBuilderを用いた連結
## StringBuilderクラス
* StringBuilderクラスは可変(mutable)
* StringBuilderインスタンスは、内部に連結し

元記事を表示

オーバーライド

# オーバーライド

:::note
オブジェクト指向言語において、**サブクラス(派生クラス)が親クラスのメソッドを再定義して上書きすること
→サブクラスは親クラスのメソッドの振る舞いを変更したり、新しい機能を追加したりできる**
:::

## オーバーライドで重要な点

– **メソッドのシグネチャが親クラスと一致していること**
シグネチャ : メソッド名、引数の型、戻り値の型

– **サブクラスでオーバーライドするメソッドは、親クラスのメソッドと同じメソッド名と引数を持ち、戻り値の型も同じである**必要がある
→メソッドの処理内容や振る舞いはサブクラスで変更可能

## オーバーライドの例

“`java
class Animal {
void makeSound() {
System.out.println(“Animal makes a sound.”);
}
}

class Cat extends Animal {
// 親クラスのmakeSoundメソッドをオーバーライド
@Override
void ma

元記事を表示

【JavaGold】Filesクラスのlist、walk、findメソッドの比較

## 比較

以下の観点で比較する。

– 対象のファイルまたはサブディレクトリ
– 使用方法

#### 対象のファイルまたはサブディレクトリ
– `list()`:指定されたディレクトリ内の直下のファイルまたはサブディレクトリをリストアップする。**サブディレクトリは再帰的には走査しない。**

– `walk()`:指定されたディレクトリ内のファイルやサブディレクトリを**再帰的に走査し、全てのエントリをリストアップする。**

:::note info
`maxDepth`パラメータを使用して、再帰の深さを制御することができる。
:::

– `find()`:指定されたディレクトリ以下で**特定の条件に合致するファイルを再帰的に検索する。**
検索条件は`BiPredicate`インタフェースを使用して指定する。

#### 使用方法
– `list()`:**直下の**ファイルまたはサブディレクトリをリストアップしたい場合に使用する。

– `walk()`:ディレクトリ以下の**全ての**ファイルまたはサブディレクトリ

元記事を表示

【JavaGold】StandardOpenOption

## 概要
Java NIO.2(New I/O)パッケージでファイルの書き込み時に指定するオプションを定義する列挙型(Enum)である。
ファイルの書き込み時に特定のオプションを指定することでファイル操作の動作を制御することができる。

#### 主な定数

– `READ`:読み取りモードでファイルを開く。
ファイルを読み取るために使用する。
– `WRITE`:書き込みモードでファイルを開く。
ファイルに書き込むために使用する。
既存のファイルを開く場合、既存の内容を上書きする。

– `APPEND`:追記モードでファイルを開く。

– `CREATE`:ファイルが存在しない場合に、新しいファイルを作成する。

– `CREATE_NEW`:ファイルが存在しない場合に新しいファイルを作成する。
既にファイルが存在する場合は例外がスローされる。

– `DELETE_ON_CLOSE`: ファイルを閉じる際に、ファイルを自動的に削除する。

– `TRUNCATE_EXISTING`: ファイルをオープンする際に、既存の内容を削除する。

– `SYNC`:書き込んだデータをディ

元記事を表示

【JavaGold】resolveメソッド

## 概要
`java.nio.file.Paths`クラスの`resolve()`メソッドは、2つの`Path`インスタンスを結合して新しい`Path`インスタンスを作成する。
このメソッドは、パスの絶対・相対の関係にかかわらず、2つのパスを連結して新しいパスを作成する。

シグネチャは以下のようになっている。

“`java
public Path resolve(Path other)
“`

引数として結合したいもう一方の`Path`インスタンス(`other`)を受け取り、それらを結合した新しい`Path`インスタンスを返す。

##### 例
例えば、次のようなディレクトリ構造があったとする。

“`
root
├── dir1
│ └── file1.txt
└── dir2
└── file2.txt
“`

以下は、`Paths.resolve()`メソッドを使用して2つの`Path`インスタンスを結合している。

“`java
import java.nio.file.Path;
import java.nio.file.Paths;

pub

元記事を表示

操車場アルゴリズムを Java で実装してみた

# 操車場アルゴリズムとは
 我々人間に分かりやすいように書かれた数式(中置記法)を、プログラムで処理しやすい数式の形(後置記法)へ変換するアルゴリズム。
ダイクストラ法でお馴染みのエドガー・ダイクストラが考案したもの。

例として中置記法で `3 + 4` と示される式は、後置記法で `34 +` と表記することが出来る。

# 実装例
“`java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

class ShuntingYard {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();

元記事を表示

ディープコピー

“`java
List a = new ArrayList<>();
a.add(“AAA”);

List b = a.subList(0,a.size());
b.add(“BBB”);

List c = new ArrayList<>(a.subList(0,a.size()));
b.add(“CCC”);

System.out.println(a);
System.out.println(b);
System.out.println(c);

/*
* [AAA, BBB]
* [AAA, BBB]
* [AAA, CCC]
*/
“`

普通に subList -> シャローコピー
subList したものをコンストラクタに渡す -> ディープコピー(もどき)

元記事を表示

Leetcode 852. Peak Index in a Mountain Array

https://leetcode.com/problems/peak-index-in-a-mountain-array/description/

# アプローチ1
## Brute-force

“`java
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int before = 0;
for (int i = 0; i < arr.length; i++) { if (before <= arr[i]) { before = arr[i]; continue; } return i - 1; } return before; } } ``` # アプローチ2 ## 二分探索 ```java class Solution { public int peakIndexIn

元記事を表示

missing return statement ~ complete normallyとcan complete normally ~

# 言い訳
筆者はJavaの授業をサボりました。
なるべく仕様書から引っ張ってきましたが、**私自身は信用ならない**ので警戒しつつお読みください。
Qiita初投稿です。

# TL; DR
– 制御フロー関連のエラーが出たら14.22 Unreachable Statements[(SE 20のやつ)](https://docs.oracle.com/javase/specs/jls/se20/html/jls-14.html#jls-14.22)を読もう
– ***complete normally***は実行時の話だよ
– ***can complete normally***はコンパイル時の話だよ
– 筆者にはcomplete normallyの必要性がわからなかったよ
– `error: missing return statement`って言われたら
returnするかthrowしよう

以降のコードはjavac 19、参照した仕様は[The Java® Language Specification
Java SE 20 Edition](https://docs.ora

元記事を表示

Javaの文字列について学習してみた

# 概要
Javaの文字列について学習してみました。以下のページを参考にしました。

文字列(Stringクラス)

https://www.javadrive.jp/start/string/

文字列を作成する

https://www.javadrive.jp/start/string/index2.html

数値を文字列に変換する

https://www.javadrive.jp/start/string/index11.html

文字列を数値に変換する

https://www.javadrive.jp/start/string/index12.html

文字列と文字列を比較する(String.equals)

https://www.javadrive.jp/start/string/index4.html

文字列と文字列の大きさを比較する(String.compareTo)

https://www.javadrive.jp/start/string/index13.html

文字列の長さを取得する(String.length)

https://www.ja

元記事を表示

[GCP] BigQueryの機能調査x実装

# GCPのBigQueryの概要と機能

## 概要
Google Cloud Platform(GCP)のBigQueryは、大規模なデータセットを効率的に保存し、クエリを実行するためのデータウェアハウスサービス。BigQueryは、高速でスケーラブルなデータ分析を実現し、ビジネスインテリジェンス(BI)や機械学習などの応用に利用される。また、クエリの実行結果のリアルタイムダッシュボードの作成や、ストリーミングデータの分析もサポートしている。

## 主な機能
### 1. ペタバイト規模のデータセットの格納
BigQueryは非常に大容量のデータセットを処理できる。データは、自動的に分散され、複数のサーバーで並列に処理されるため、スループットとパフォーマンスが最適化される。データの格納や管理についても、ユーザーが意識する必要はない。

### 2. スキーマレスなデータベース
BigQueryは、スキーマレスなデータベースとして機能する。データを格納する際、スキーマを事前に定義する必要はない。そのため、異様な形式のデータでも簡単に格納でき、また、JSONやAvro、Parquet

元記事を表示

github備忘録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519817/33df0817-0188-97cb-b0a9-386cbe314d73.png)
リポジトリ作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519817/fbb16e46-18c5-b621-e9e1-c811ac3a0f9b.png)
public repositori name のみを入力し作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519817/835615c4-757a-f329-f876-3d59fa24de0f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519817/d2fc53

元記事を表示

【SpringBoot】図書の貸出管理システムを作りたい

# はじめに
前回までの内容で図書管理システムの設計しログイン機能を実装したので、それにChatGPTに質問しながらEclipseを使って開発をした流れを記事にしました

https://qiita.com/EasyCoder/items/d4c5da73ba922fb189e1

https://qiita.com/EasyCoder/items/3a717db1761ddd9d3ae0

## システム実装に必要なリソース

今回は図書の貸出登録機能を実装するため以下が必要になります

### 追加するテーブル
– 図書の情報(Booksテーブル)
– 貸出ユーザー管理(BorrowedBooksテーブル)
– 貸出履歴管理(BorrowHistoryテーブル)

### 追加する機能
– ブラウザで図書の一覧表示
– 図書の検索機能
– 貸出ボタン/返却ボタン
– 図書詳細閲覧

## 一覧表示機能の実装(Booksテーブルの実装)

### ファイル構造図(Booksクラス)
“`java:追加予定図
src/
main/
java/
com/

元記事を表示

[Java] 文字列の変換

# 文字列の変換とは
* Javaで文字列を変換・加工できる
# 基本的な文字列変換方法
## toLowerCase()
* 大文字を小文字に変換する
“`java:toLowCase()
public String toLowCase()
“`
## toUpperCase()
* 小文字を大文字に変換する
“`java:toUpperCase()
public String toUpperCase()
“`
## trim()
* 前後の空白を除去する(半角スペース、改行文字やタブ文字)
* 全角スペースは含まない
“`java:trim()
public String trim()
“`
## replace()
* 文字列を置き換える
* 対象の文字列から“`第1引数“`で指定した文字列を“`検索“`し、マッチした文字列を“`第2引数“`で指定した文字列で“`置換“`する。そして、置換後の文字列を戻り値として返す。
“`java:replace()
public String replace(String before, String a

元記事を表示

【JavaGold】NIO.2②

## 概要
`java.nio.file.Files`クラスは、ファイルの作成・コピー・削除・移動・属性の読み書きなど、さまざまなファイル操作を簡単に行うためのメソッドを提供する。

#### 主なメソッド

– `copy(Path source, Path target, CopyOption… options)`:
指定したファイルを別の場所にコピーする。
コピー元のファイルは残る。

– `createFile(Path path)`:
指定したファイルを新規作成する。

– `delete(Path path)`:
指定したファイルを削除する。

– `move(Path source, Path target, CopyOption… options)`:
指定したファイルを別の場所に移動する。
コピー元のファイルは消える。

– `exists(Path path)`:
指定したパスにファイルが存在するかどうかを確認する。

– `deleteIfExists(Path path)`:
指定したパスのファイルの存在確認と削除を同時に行う。

– `getAttr

元記事を表示

【JavaGold】NIO.2①

## 概要
Java SE 7から導入された、新しいI/O(Input/Output)APIのひとつである。
NIO.2(JSR 203: More New I/O APIs for the Java Platform)は、従来のJava I/O API(`java.io`パッケージ)よりも高度なI/O操作をサポートしている。

NIO.2ではファイルやディレクトリへのパスを表す`java.nio.file.Path`インタフェースを使用する。

#### 主なメソッド

– `static Path get(String first, String… more)`:
指定された文字列からパスを作成する。

– `Path getParent()`:
パスの親ディレクトリを返す。

– `Path getFileName()`:
パスのファイル名部分を返す。

– `toAbsolutePath()`:
絶対パスを取得して返す。

– [`Path resolve(Path other)`](https://qiita.com/knmbpc/items/447a881500b93

元記事を表示

Javaの配列について学習してみた

# 概要
Javaの配列について学習してみました。以下のページを参考にしました。

配列

https://www.javadrive.jp/start/array/

配列の宣言と配列の作成

https://www.javadrive.jp/start/array/index2.html

配列要素へのアクセスとインデックス

https://www.javadrive.jp/start/array/index4.html

配列の要素の初期化と規定値

https://www.javadrive.jp/start/array/index5.html

配列の長さを取得する(length)

https://www.javadrive.jp/start/array/index6.html

多次元配列を作成する

https://www.javadrive.jp/start/array/index7.html

多次元配列の初期化

https://www.javadrive.jp/start/array/index8.html

多次元配列の長さを取得する(length)

ht

元記事を表示

【JavaGold】カスタム・シリアライズ

## 概要
Javaのオブジェクトを直列化する際に、自由に書き出し、読み込みを制御できる方法である。

通常、Javaのシリアライゼーションは`Serializable`インタフェースを実装することによって行われる。
カスタム・シリアライズは、全てのフィールドを書き出したくない場合や、特定の方法でカスタマイズしたい場合に使用する。

カスタム・シリアライズでは、以下のメソッドを使用して制御を行う。

– **`private void writeObject(ObjectOutputStream out) throws IOException`**:
シリアライズ(書き出し)時に自動的に呼び出されるメソッド。
引数として`ObjectOutputStream`オブジェクトへの参照を受け取り、各データに応じたメソッドを使用して書き出したいフィールドを出力する。

– **`private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException`**:
デシリアライズ(読み込み)時に自

元記事を表示

【JavaGold】listFilesメソッド

## 概要
指定されたディレクトリ内のファイルとディレクトリの一覧を`File`オブジェクトの配列として取得する。

`listFiles()`メソッドは以下のように定義されている。

“`java
public File[] listFiles()
“`

このメソッドは、呼び出された`File`オブジェクトがディレクトリである場合に使用する。
ディレクトリ内のファイルやディレクトリに対して、`File`オブジェクトの配列を返す。
ディレクトリが空の場合、またはファイルではなくディレクトリが含まれていない場合は、空の配列が返される。

##### 例

以下のようなディレクトリ構造があるとする。

“`
/path/to/directory/
├── file1.txt
├── file2.txt
└── subdirectory/
├── file3.txt
└── file4.txt
“`

“`java
import java.io.File;

public class ListFilesExample {

元記事を表示

OTHERカテゴリの最新記事