サンプルコード
Java のサンプルコード一覧
Java で「○○するには」を解決するコードサンプル。28 件。
他の言語から探す
カードの実行確認済みは、この言語のコードを実際に実行して出力を確認したことを表す。静的確認は、実行環境を用意できず、構文と公式 API ドキュメントで確認したものである。
正規表現で部分文字列を取り出すには
Matcher は find か matches を呼んで一致を確定させてから group を呼ぶ。順番を逆にすると IllegalStateException になる。(?<name>...) で付けた名前は group(String) で引け、番号のずれに強くなる。
実行確認済み
文字列が正規表現に一致するか調べるには
Matcher.matches は文字列全体の一致、find は部分一致を判定する。String.matches も全体一致なので、部分一致のつもりで使うと常に false になる。同じパターンを使い回すなら、Pattern.compile の結果を定数として保持するとコンパイルが 1 度で済む。
実行確認済み
正規表現で置換するには
String.replaceAll は正規表現として解釈し、replaceFirst は最初の 1 件だけを置き換える。名前が似ている replace は正規表現ではなく文字列そのものを探すので、メタ文字をそのまま扱いたいときはこちらを使う。置換文字列の中では $1 で後方参照する。
実行確認済み
2つの日付の差を求めるには
日付単位の差は ChronoUnit.DAYS.between が読みやすい。時刻を含む差は Duration.between で取るが、toHours / toDays は切り捨てて整数を返すため、36 時間 30 分は 36 と表示される。端数まで見たいときは toMinutes のように細かい単位へ落としてから割る。
実行確認済み
文字列が含まれるか調べるには
String.contains が部分文字列の判定で、既定では大文字小文字を区別する。標準の String には containsIgnoreCase が無く、それは Apache Commons Lang の StringUtils にあるメソッドなので、依存を足したくなければ片方を toLowerCase で畳んで比較する。位置が決まっているなら regionMatches の第1引数に true を渡して部分一致を無視比較できる。
実行確認済み
配列から重複を除くには
LinkedHashSet は挿入順を保つ集合なので、これを経由すると出現順のまま重複が消える。順序が不要なら HashSet で十分だが、その場合は並びが保証されない。
実行確認済み
配列を文字列に連結するには
String.join は CharSequence の並びだけを受け取るため、数値のリストは String::valueOf で写してから Collectors.joining に渡す。joining は前後の飾り文字も同時に指定できるので、括弧付きの出力もひと息で作れる。
実行確認済み
文字列を分割するには
String.split の第1引数は文字列ではなく正規表現として解釈される。ドットやパイプなどのメタ文字をそのまま渡すと意図しない分割になるため、リテラルとして分けたいときは Pattern.quote で囲むかエスケープする。空白区切りは split("\\s+") のように正規表現を渡すと連続空白をまとめられる。
静的確認
配列を条件で絞り込むには
Stream の filter は中間操作なので、toList のような終端操作を呼んで初めて評価される。Stream.toList は Java 16 で追加されたメソッドで、それ以前は collect(Collectors.toList()) を使う。
実行確認済み
ディレクトリ内のファイル一覧を取得するには
Files.list が返す Stream はディレクトリを開いたままにするので、try-with-resources で閉じる。閉じ忘れるとファイルハンドルが残り、多数のディレクトリを走査したときに枯渇する。
実行確認済み
ネストしたJSONから値を取り出すには
Jackson の path は、キーが無いときに null ではなく MissingNode を返すため、途中で切れても連鎖を書き続けられる。asInt / asText に既定値を渡せばそのまま倒せる。get だと null が返り、次の呼び出しで NullPointerException になる。
静的確認
HTTPリクエストにヘッダーを付けるには
HttpRequest.Builder の header を並べるとリクエスト単位でヘッダーが付く。なお Java の HttpClient は Host や Content-Length など一部のヘッダーを制限しており、自分で設定しようとすると IllegalArgumentException になる。
静的確認
環境変数を設定するには
Java には自プロセスの環境変数を変更する標準 API が無く、System.getenv() が返すマップは変更不可である。書き換えられるのは ProcessBuilder.environment() が返す「親の環境のコピー」だけで、これは start() で起動する子プロセスにのみ反映される。自分の JVM に値を渡したいなら起動時に -D でシステムプロパティを使う。
実行確認済み
.env ファイルを読み込むには
dotenv-java は読み込んだ値を Dotenv オブジェクト経由で返し、System.getenv には流し込まない。したがって取得は dotenv.get() を使う。.env が無くても落としたくない場合は Dotenv.configure().ignoreIfMissing().load() を使う。
静的確認
日付文字列を日付型にするには
java.time の parse は ISO 8601 が既定なので、LocalDate.parse や OffsetDateTime.parse は書式指定なしで読める。独自書式は DateTimeFormatter.ofPattern を渡す。パターンの年は yyyy ではなく uuuu を選ぶと、紀元をまたぐ入力で意図しない解釈になるのを避けられる。失敗は DateTimeParseException になる。
実行確認済み
文字列の前後の空白を除去するには
String.strip は Character.isWhitespace の定義で前後の空白を落とすため、全角スペース(U+3000)も除去できる。古くからある trim は U+0020 以下の文字しか対象にせず全角スペースが残るので、日本語を扱うなら strip を選ぶ。片側だけなら stripLeading / stripTrailing を使う。
実行確認済み
HTTP POSTでJSONを送るには
Java 11 以降の java.net.http.HttpClient で POST を送れる。BodyPublishers.ofString に本文の文字列を渡し、Content-Type を明示する。この例だけ JSON をテキストブロックで直接書いているのは、Java の標準ライブラリに JSON シリアライザが無いためである。値が固定のうちはこれで足りるが、動的な値を埋めるなら Jackson などに任せる。手で連結すると引用符や改行のエスケープで壊れる。
静的確認
ファイルが存在するか調べるには
Files.isRegularFile は存在しない場合も属性を読めない場合も false を返す。Files.exists はディレクトリでも true になるため、ファイルとして開く前提なら isRegularFile を選ぶ。
静的確認
オブジェクトをJSON文字列にするには
JDK の標準ライブラリに JSON は含まれないため、Jackson や Gson を依存に追加する。writeValueAsString が 1 行の JSON を返し、writerWithDefaultPrettyPrinter() を挟むと整形される。record はコンポーネント名がそのままキーになる。
静的確認
日付を書式付きの文字列にするには
DateTimeFormatter のパターンは大文字と小文字で意味が別で、MM が月、mm が分である。定型の ISO 形式なら ISO_LOCAL_DATE などの定数が用意されているので、自前のパターンを書かずに済ませる。
静的確認
環境変数を読むには
System.getenv は未設定の環境変数に対して null を返すため、そのまま使うと NullPointerException の原因になる。null チェックで既定値を補うか、Optional でラップして扱う。
実行確認済み
ファイルを読み込むには
Files.readString は Java 11 以降で使え、ファイル全体を UTF-8 の String として読み込む。それ以前のバージョンでは Files.readAllBytes と new String を組み合わせる。
静的確認
ファイルに書き込むには
Files.writeString は Java 11 以降で使え、既定では UTF-8 で新規作成または上書きする。末尾に足したいときは StandardOpenOption.APPEND を渡す。
静的確認
HTTP GETリクエストを送るには
Java 11 で java.net.http.HttpClient が標準に入ったので、GET を送るだけなら外部ライブラリは要らない。JSON を構造体へ写す段になって初めて Jackson などが必要になる、という切り分けで考えると依存を最小にできる。
実行確認済み
配列をソートするには
配列は Arrays.sort、List は Collections.sort か list.sort でその場で昇順に並べ替える。降順や独自基準にするときは Comparator を渡す。プリミティブの int[] は Comparator を使えないため、降順にするなら Integer[] にするか後で反転する。
実行確認済み
現在時刻を取得するには
Instant は常に UTC 上の瞬間を表し、タイムゾーンの概念を持たない。地域時刻として表示したいなら ZonedDateTime を使う。可変で扱いにくい java.util.Date ではなく、Java 8 以降は java.time パッケージを使うのが標準である。
実行確認済み
JSONをパースするには
JDK の標準ライブラリには JSON パーサが含まれないため、Jackson や Gson を依存に追加する必要がある。Jackson の ObjectMapper は readValue に渡した型へマッピングし、record にも対応する。JSON 側に未知のキーがあると既定で例外になるので、必要なら FAIL_ON_UNKNOWN_PROPERTIES を無効にする。
静的確認
文字列を置換するには
replace は正規表現を使わないリテラルの全置換である。replaceAll と replaceFirst は第1引数が正規表現として解釈されるため、ドットや括弧を含む文字列は Pattern.quote でエスケープする。
静的確認