モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

Java の落穂拾い

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2016/06/18
最終更新最終更新
2019/11/10
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    Javaちょっとできるプログラマ。教育業界のエンジニアです。

    0
    ステッカーを贈るとは?

    ラムダ式 (Java 8)

    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Function;
    
    class Main {
    
        public static String myFunc(Function<String, String> callback) {
            return callback.apply("hi");
        }
    
        public static void main(String args[]) {
    
            // コールバック関数
            System.out.println(myFunc(s -> s + "!")); //=> hi!
    
            // Scala のようなコレクション操作
            List<String> list = Arrays.asList("aaa", "bbb");
    
            list.forEach(s -> System.out.println(s)); 
    
            for(String s: list) {   // Java 7 までのよくある書き方
                System.out.println(s);
            }
    
            // 変数に代入
            Function<String, String> func = (String s) -> {
                return s + "!";
            };
            Function<String, String> func2 = (String s) -> s + "!"; // 一行記法
            Function<String, String> func3 = s -> s + "!"; // 型の省略
            System.out.println(func.apply("hi")); //=> hi!
            System.out.println(func2.apply("hi")); //=> hi!
            System.out.println(func3.apply("hi")); //=> hi!
        }
    }
    

    実装のあるインターフェース (Java 8)

    Java 8 から Interface が実装をもてるようになりました。Scala トレイトのようなものです。

    MyInterface.java

    public interface MyInterface {
        default public String func() {
            return "MyInterface.func";
        }
    }
    

    MyClass.java

    public class MyClass implements MyInterface {
        // オーバーライドする場合
        // public String func() {
        //     return "hello, " + MyInterface.super.func();
        // }
    }
    

    Main.java

    class Main {
        public static void main(String args[]) {
            MyInterface obj = new MyClass();
            System.out.println(obj.func());
        }
    }
    

    実行例

    $ javac *.java && java Main
    MyInterface.func
    

    static インポート

    通常 import は、あるパッケージのクラスを指定します。import static とすることで、あるパッケージのクラスの静的メンバを指定できます。

    import static java.lang.Math.PI;
    import static java.lang.Math.cos;
    
    class Main {
        public static void main(String args[]) {
            System.out.println(cos(PI)); //=> -1.0
        }
    }
    

    インナークラス

    MyClass.java

    public class MyClass {
        private String str = "abc";
    
        private class MyInnerClass {
            private String func() {
                return str;
            }
        }
    
        public String func() {
            MyInnerClass obj = new MyInnerClass();
            return obj.func();
        }
    }
    

    Main.java

    class Main {
        public static void main(String args[]) {
            MyClass obj = new MyClass();
            System.out.println(obj.func());
        }
    }
    

    実行例

    $ javac *.java && java Main
    abc
    

    例外について

    Java の例外クラスは java.lang.Throwable を継承する以下の三つのクラスのいずれかを継承しています。

    • java.lang.Error (JVM の実行が継続できない致命的なエラー; try-catch-finally で扱うものではありません)
    • java.lang.Exception (検査例外; コンパイル時に try-catch-finally の実装が強制されます)
    • java.lang.RuntimeException (実行時例外; コンパイル時に try-catch-finally の実装が強制されません。java.lang.Exception を継承しています)

    Error, Exception, RuntimeException それぞれの具体例は、以下の Javadoc で確認できます。例えば NullPointerExceptionRuntimeException です。

    実行時例外の例

    class Main {
    
        public static void myFunc() throws ArithmeticException, NullPointerException { // いずれも実行時例外
            throw new NullPointerException("ぬるぽ");
        }
    
        public static void main(String args[]) {
            myFunc(); // 実行時例外は try-catch で囲まなくてもコンパイルは通ります。
        }
    }
    

    例外情報の表示

    class Main {
        public static void main(String args[]) {
            try {
                throw new NullPointerException("ぬるぽ");
            }
            catch (ArithmeticException | NullPointerException e) {
                System.out.println(e.getMessage()); //=> ぬるぽ
                e.printStackTrace(); //=> java.lang.NullPointerException: ぬるぽ...
            }
        }
    }
    

    Java 7 から利用できる、リソースを自動でクローズする構文 (try-with-resources)

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    class Main {
        public static void main(String args[]) {
            try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("Main.java"), "UTF-8"));
                BufferedReader reader2 = new BufferedReader(new InputStreamReader(new FileInputStream("Main.java"), "UTF-8"))) {
                String line = null;
                while((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            }
            catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    外部コマンドの実行

    import java.util.Map;
    import java.io.File;
    import java.io.IOException;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    class Main {
        public static void main(String args[]) {
            try {
                // コマンド指定
                ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");
    
                // 環境変数の操作
                Map<String, String> environment = processBuilder.environment();
                System.out.println(environment.get("PATH"));
                environment.put("DUMMY", "aaa");
    
                // プロセスの動作ディレクトリを指定して非同期実行
                Process process = processBuilder.directory(new File("/")).start();
    
                // 標準 (エラー) 出力を取得
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line = null;
                while((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
    
                // 非同期実行したプロセスが終了するのを待つ
                process.waitFor();
                // process.destroy(); // 強制終了したい場合
    
                // 終了ステータス
                System.out.println(process.exitValue()); //=> 0 (正常)
            }
            catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    JVM 設定 (システムプロパティと環境変数)

    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    
    class Main {
        public static void main(String args[]) {
    
            // JVM システムプロパティ (Java 8 で表示する例)
            System.setProperty("my.prop1", "123"); // `java -Dmy.prop1=123 Main` と同じ効果
    
            List<String> list = Arrays.asList("my.prop1", //=> 123
                                              "file.encoding", //=> UTF-8
                                              "file.separator", //=> /
                                              "path.separator", //=> :
                                              "java.version", //=> 1.8.0_60
                                              "java.vm.name", //=> Java HotSpot(TM) 64-Bit Server VM
                                              "java.home", //=> /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre
                                              "java.library.path", //=> /Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
                                              "os.name", //=> Mac OS X
                                              "os.version", //=> 10.10.5
                                              "os.arch", //=> x86_64
                                              "user.dir"); //=> /path/to/current/dir
    
            list.forEach(s -> System.out.println(System.getProperty(s)));
    
            // JVM プロセスの環境変数 (Java 8 で表示する例)
            Map<String, String> map = System.getenv();
            map.forEach((key, value) -> System.out.println(key + "=" + value));
            System.out.println(System.getenv("PATH")); //=> /usr/local/bin:/usr/bin:/bin
        }
    }
    

    リフレクション

    クラスの構造を実行中に読み取ることができます。

    Main.java

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    class Main {
    
    public static String toString(Object obj) {
    
    StringBuilder sb = new StringBuilder();
    Class clazz = obj.getClass(); // Class インスタンス
    
    sb.append(clazz.getName());
    
    Field[] fields = clazz.getDeclaredFields();
    Method[] methods = clazz.getDeclaredMethods();
    
            for(Field field : fields) {
    sb.append("," + field.getName());
    }
            for(Method method : methods) {
    sb.append("," + method.getName());
    }
    return sb.toString();
    }
    
        public static void main(String args[]) {
    MyClass obj = new MyClass();
    System.out.println(Main.toString(obj));
        }
    }
    

    MyClass.java

    public class MyClass {
        public int iPublic;
        private int iPrivate;
        public void methodPublic(){}
        private void methodPrivate(){}
    }
    

    実行例

    $ javac *.java && java Main
    MyClass,iPublic,iPrivate,methodPublic,methodPrivate
    

    ジェネリクス

    Java SE 5 から導入された、C++ のテンプレートのような機能です。Java コレクションのリストで List<Integer> list といった記述を行うことで、リストに格納される要素の型を明記できます。リストクラスのように、型を明記せずにジェネリックな状態で汎用的に定義することで、特定の型に依存しないクラスを定義できます。

    Main.java

    package myproject;
    
    public class Main {
    
        public static void main(String[] args) {
            MyClass<String> objStr = new MyClass<String>("string");
            System.out.println(objStr.get());
        }
    }
    

    MyClass.java

    package myproject;
    
    public class MyClass<T> {
        T obj;
    
        public MyClass(T obj) {
            this.obj = obj;
        }
    
        public T get() {
            return obj;
        }
    }
    

    実行例

    string
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    Javaちょっとできるプログラマ。教育業界のエンジニアです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん12/4/2019に更新
        いいねアイコン画像0
      • Java配列の宣言方法 (C/C++との違い)
        Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
        てんとうむしてんとうむし5/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta1/21/2020に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太10/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん10/12/2017に更新
        いいねアイコン画像0