Gradleとは何者?インストール方法〜使い方までわかりやすく解説
Javaプログラミングを学習するうえで、「Java8はいつまで使える?」と悩んでいる方も多いのではないでしょうか?
「Java8のサポート期限はいつまで?」
「Java8の新機能の使い方がわからない」
といった疑問に対して、本記事ではJava8について初心者エンジニア向けに詳しく解説していきます。
※本記事で紹介するサンプルコードは、Java18で動作確認しています。
1.そもそもJava8とは?
Java8とは「Java Platform, Standard Edition 8」の略称で、多くのJavaプラットフォームプログラムで利用されるJava APIの集合体です。
①リリース日
2014年3月にJava8が正式にリリースされました。Premier Support期限が2022年3月、Extended Support期限が2030年12月までとなっています。
②現在のJava8最新バージョン
Java8の最新バージョンは、2022年1月18日にリリースされた「Version8 Update 321」です。(2022年3月現在)
2.Java8から登場した新機能
Java8で追加された機能について、サンプルコードと共に解説していきます。
①ラムダ式
ラムダ式は、関数型インターフェースの実装を簡潔に記述できる機能です。関数型インターフェースとは、実装するメソッドがひとつだけのインターフェースのことです。
まずは、ラムダ式を使わずにインターフェースを実装するプログラムを見てみましょう。
interface Human {
public String introduction(String name);
}
public class App {
public static void main(String[] args) {
Human human = new Human() {
public String introduction(String name) {
return "私の名前は " + name + "です";
}
};
System.out.println(human.introduction("太郎"));
}
}
実行結果:
私の名前は 太郎です
次に、ラムダ式を使ったプログラムを見てみましょう。
interface Human {
public String introduction(String name);
}
public class App {
public static void main(String[] args) {
Human human = (name) -> {return "私の名前は " + name + "です";};
System.out.println(human.introduction("太郎"));
}
}
実行結果:
私の名前は 太郎です
ラムダ式の構文は次の通りです。
インターフェース名 変数名 = ([データ型]引数 [,データ型 引数]...) -> {メソッド処理}
メソッド処理は、関数型インターフェースのメソッドをオーバーライドします。
ラムダ式を使うと、インターフェースの実装部分が簡潔に記述できることがわかりますね。
②Optional API
Optionalは、オブジェクトがnullかどうかをチェックする機能です。
import java.util.Map;
import java.util.Optional;
class PremierList {
public Map<Integer,String> list;
public PremierList(Map<Integer,String> list){
this.list = list;
}
public Optional<String> getNameByGeneration(Integer generation){
return Optional.ofNullable(this.list.get(generation));
}
}
public class App {
public static void main(String[] args) {
PremierList premierList = new PremierList(Map.of(
1,"伊藤博文",2,"黒田清隆",98,"安倍晋三",99,"菅義偉",100,"岸田文雄"));
Integer generation = 100;
Optional<String> nameOptional = premierList.getNameByGeneration(generation);
nameOptional.ifPresent(name -> System.out.println("第" + generation + "代総理大臣の名前は" + name + "です。"));
}
}
実行結果:
第100代総理大臣の名前は岸田文雄です。
ofNullable
nullかもしれない値をもつOptionalオブジェクトを返します。
ifPresent
Optionalオブジェクトの値が非nullの場合、その値で引数の処理を実行します。
Optionalオブジェクトの値がnullの場合、例外はスローされず、何も実行されません。
この記事では詳細説明は省きますが、気になる人は公式リファレンスを確認してみてください。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html
③Stream API
Stream APIは配列やListの操作を簡潔にする機能です。
import java.util.Arrays;
import java.util.List;
public class App {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
list.stream() //streamを取得
.filter(i -> i % 2 != 0) //中間操作
.forEach(i -> System.out.println(i)); //終端操作
}
}
実行結果:
1
3
5
7
9
サンプルは1から10までをList化し、奇数値のみを取り出して出力するプログラムです。
Streamを取得後、filterメソッドで「2で割り切れないもの」を集め、forEachメソッドで「ひとつずつ画面に出力」します。
ここでも詳細説明は省きますが、気になる人は公式リファレンスを見てみてください。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html
④日付時刻API
Java8からjava.timeパッケージに新しいAPIが追加されました。
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
public class App {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
System.out.println("現在日付:" + localDate);
// 上記指定日付の月末日(2022-03-30)
LocalDate localDateMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("月末指定:" + localDateMonth);
// 上記指定日付から次の水曜日
LocalDate localDateWeek = localDate.with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));
System.out.println("指定曜日:" + localDateWeek);
}
}
実行結果:
現在日付:2022-03-30
月末指定:2022-03-31
指定曜日:2022-04-06
※このプログラムは2022年3月30日に実行しています。
公式リファレンスは以下です。
https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html
⑤interfaceのdefaultメソッド・staticメソッド
Interfaceのdefaultメソッドにより、処理内容を実装したメソッドを定義できるようになりました。
interface Human{
default String introduction(){
return "こんにちは、私は会社員です。";
}
}
class JapanesePeople implements Human{}
public class App {
public static void main(String[] args) {
JapanesePeople japanesePeople = new JapanesePeople();
System.out.println(japanesePeople.introduction());
}
}
実行結果:
こんにちは、私は会社員です。
Humanインターフェースを実装するJapanesePeopleクラスで、introductionクラスをオーバーライドしていませんが、コンパイルエラーになりません。
また、staticメソッドも定義できるようになりました。
interface Human{
public static String introduction(){
return "Hi, I am an office worker";
}
}
public class App {
public static void main(String[] args) {
System.out.println(Human.introduction());
}
}
実行結果:
Hi, I am an office worker
staticメソッドを使用しているので、Appクラスではインスタンスを生成せずに、Interfaceから実行しています。
⑥アノテーション
アノテーションとは、注釈という意味です。Javaではアノテーションを使うことで、実行環境によってプログラムの動作を変更したり、コンパイラが出力する警告メッセージを抑制したりできます。
ここでは、標準アノテーション型のOverrideとDeprecatedを紹介します。
Override
Overrideはスーパークラスのメソッドをオーバーライドするアノテーションです。
このアノテーションは、スーパークラスに同名のメソッドがない場合コンパイルエラーになるので、タイプミスを防ぐことができます。
サンプルコードを見てみましょう。
class SuperClass {
public void process(){
System.out.println("SuperClassの処理");
}
}
class SubClass extends SuperClass{
@Override
public void proces(){
System.out.println("SubClassの処理");
}
}
public class App {
public static void main(String[] args) {
SubClass sb = new SubClass();
sb.process();
}
}
実行結果:
シンボルを見つけられません
シンボル: クラス OverrideOverride
場所: クラス SubClass
サンプルコードを実行すると、上記のコンパイルエラーメッセージが表示されます。これは、SubClassのprocesメソッドがタイプミスしているため発生したエラーです。
もし@Overrideがない場合は、コンパイルエラーになりません。タイプミスしたprocesメソッドがそのまま定義されます。
プログラムを実行すると、SuperClassクラスのprocessメソッドが実行され、意図しない動作になります。
下記のようにprocessと修正すると、コンパイルが成功し、SuperClassクラスのprocessメソッドをオーバーライドできたことがわかりますね。
class SuperClass {
public void process(){
System.out.println("SuperClassの処理");
}
}
class SubClass extends SuperClass{
@Override
public void process(){
System.out.println("SubClassの処理");
}
}
public class App {
public static void main(String[] args) {
SubClass sb = new SubClass();
sb.process();
}
}
実行結果:
SubClassの処理
Deprecated
Deprecatedはクラスやメソッドが非推奨であることを知らせるアノテーションです。
サンプルを見てみましょう。
class OldClass{
@Deprecated
public void oldMethod(){
System.out.println("このメソッドは使わないでください。");
}
public void newMethod(){
System.out.println("こちらのメソッドを使ってください");
}
}
public class App {
public static void main(String[] args) {
new OldClass().oldMethod();
}
}
警告メッセージ:
OldClassのoldMethod()は推奨されません(compiler.warn.has.been.deprecated)
このように、Deprecatedアノテーションが指定されたoldMethodメソッドを使用しようとすると、エディタ上で警告が表示されます。
クラスのバージョンアップ時に、既存プログラムとの互換性は維持し、新しいプログラムでは新しいメソッドしか使わないように制御したい、といった時に便利なアノテーションです。
3.Java8とJava11の違い
Java8とJava11の違いを以下に記載します。
ローカル変数について型推論ができる
Java11ではvarによる型推論ができるようになりました。型推論とは、変数の型を宣言せずにさまざまな型の変数を扱える機能です。
注意点として、var型はすべての値を扱えるわけではありません。宣言で代入する時点でvarの型は決まり、その後は決まった型でしか使えません。
interfaceにprivateメソッドが使える
Java11はinterfaceにprivateのメソッドが宣言できるようになりました。同じインターフェース内のstaticメソッドやdefaultメソッドから使用できます。
_(アンダーバー)を変数に使用できなくなった
Java11から_(アンダーバー)を変数に使用できなくなりました。
①Java8とJava11どちらを選ぶ?
Java8のリリースは8年前と古いですが、Java8は長期間サポートされていることからも、まだまだ多くの企業で使用されています。
現行システムの稼働状況、新規システムの要件、Javaのサポート期限など慎重に検討したうえで、現場に合わせて選択しましょう。
4.Java8の環境構築方法
ここでは、Java8の環境構築方法を見ていきましょう。本記事ではMacに環境構築する方法を説明します。
①ダウンロード
公式サイトからJavaをダウンロードしましょう。
②インストール
ダウンロードしたファイルをインストールしましょう。
アイコンをダブルクリックします。
「開く」をクリックします。
「インストール」をクリックします。
この画面が表示されると、インストール完了です。
③アップデート
Javaの更新方法を紹介します。
システム環境設定画面から「Java」アイコンをクリックしましょう。
Javaコントロール・パネルの更新タブをクリックします。
サンプル画像は、更新バージョンがない状態です。更新バージョンが存在する場合は、「今すぐ更新」が表示されるので、クリックすると更新されます。
④アンインストール
Java8をアンインストールする場合は、ターミナルで以下のコマンドを入力します。
sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -fr /Library/PreferencesPanes/JavaControlPanel.prefPane
sudo rm -fr ~/Library/Application\ Support/Oracle/Java
1番目のコマンドを実行後、パスワードを入力する必要があります。
5.Java8を使い続ける際の注意点
実際にJava8を使い続ける際の注意点は何があるのでしょうか?具体的な注意点を紹介します。
①Java8のサポート期限
Java8はLTSバージョンのため、2030年12月までサポートが継続されます。
サポート期限までに、アプリケーションをいつバージョン移行するのがよいか判断し、移行計画を立てる必要があります。
②最新版にアップデートを推奨
Javaはおよそ3ヶ月に一回のペースで、新機能の追加や性能の向上、ウィルス対策などの更新がされます。
快適に、そして安全にソフトウェアやWebサービスを使うために、最新版に更新することをおすすめします。