| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

言語まとめ Java

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

言語まとめ Java

言語 まとめ | Java|

準備

参照サイト

環境

言語基本

データ型

データ型
内容
boolean trueもしくはfalse
char UTF-16文字をあらわす、符号なし整数
byte
short
int
long
float
double
文字列
String msg = "hello.";
char[] c1 = {'a', 'b', 'c'];
Sring s1 = new String(c1);
配列
int[] a1 = new int[3];
a1[0] = 1;
a1[1] = 2;
a1[2] = 3;

int[] a2 = {1, 2, 3};

int[][] a3 = {
  {1,2,3},
  {4,5,6},
  {7,7,9},
};
コレクション
  • List
List l = new ArrayList();
l.put("a");
l.put("b");
// ジェネリックスを使用
List<String> l2 = new ArrayList<String>();
  • Map
Map<String, Object> m = new HashMap<String, Object>();
m.put("foo", new Hoge("foo"));
m.put("bar", new Hoge("bar"));


変数

演算

演算子 内容
++ -- インクリメント、デクリメント
+ - * / 単項 加算、減算、乗算、除算
% 剰余
~ ビット反転
! 否定
(型) キャスト
<< >> >>> シフト >>は符号つき右シフト
< <= >= > 大小比較
== != 相等性、不等性
ビット演算子 AND XOR OR
&& || ブール演算用ショートサーキット
instanceof オブジェクト型比較
?: 条件演算子 char b = (true)?'t':'f';

制御

順次

文の終わりは、;

選択
  • if
if (cond1) {
  // 
} else if (cond2) {
  // 
} else {
  // 
}
  • switch
switch (cond) {
case 1:
   //
   break;
case 2:
   //
   break;
defaul:
   //
} 
繰り返し
  • for
for (int i=0; i<100; i++) {
   //
}
  • 拡張for
String[] ss = {"a", "b", "c"};
for(String s : ss) {
   //
}
  • while
wihle(cond) {
  //
}
do {
  //
} while(cond);

例外
try {
  // 例外が発生する可能性がある処理
} catch (Exception e){
  // 例外処理
}

オブジェクト

クラス
  • 継承

ラムダ式

  • Java8以降では、メソッドも型の一つ
  • メソッドを引数として渡すこともできる。
    • 引数の型と数、戻り値の型が同一であるメソッド参照を渡せるようになる
  • その仕組みが、メソッド参照であり、ラムダ式
メソッド参照
public class MethodRef {

    public static void main(String[] args) {
        // メソッド参照による引き渡し
        writeLine("Quote test.", MethodRef::quote);  
        writeLine("Indent test.", MethodRef::indent);
    }
    private static void writeLine(String line, Converter converter) {
        System.out.println(converter.covert(line));
    }

    /** Converter型に対応したメソッド */
    public static String quote(String value) {
        return String.format("\"%s\"", value);
    }
    /** Converter型に対応したメソッド */
    public static String indent(String value) {
        return String.format("\t%s", value);
    }

    /** Stringを受け取りStringを返すメソッド型 */
    @FunctionalInterface
    public interface Converter {
        String covert(String value);
    }
}
  • 結果
"Quote test."
        Indent test.
ラムダ式基本
  • 上記のメソッド参照の例では、writeLineメソッドに引き渡すためだけに、quoteおよびindentメソッドを定義している
  • その場限りの利用の場合、メソッド定義を式として表すことができるラムダ式を利用できる
(引数型 仮引数) -> {
     メソッド本体
}
  • メソッド参照を使用して書いたコードをラムダで書き換え
public class Lambda {
    public static void main(String[] args) {
        writeLine("Quote test.", (String value) -> {
            return String.format("\"%s\"", value);
        });
        writeLine("Indent test.", (String value) -> {
            return String.format("\t%s", value);
        });
    }
    private static void writeLine(String line, Converter converter) {
        System.out.println(converter.covert(line));
    }

    /** Stringを受け取りStringを返すメソッド型 */
    @FunctionalInterface
    public interface Converter {
        String covert(String value);
    }
}
java.util.function関数型インターフェース
  • 関数インターフェースを上記では自作したが、java.util.function パッケージで提供されている1
名称 内容
Consumer 値を返さない。処理のみ。
Supplier 値を返す。引数なし。
Function 値を返す。引数あり。
Predicate 真偽値を返す。引数あり。
BinaryOperator 演算結果を返す。引数2つあり。
UnaryOperator 演算結果を返す。引数1つ。
import java.util.function.*;

public class BuildInFuncInf {

    public static void main(String[] args) {
        String[] num = {"1","2","3"};

        printFunc(num, (value) -> Integer.parseInt(value) * 10 );
        printFunc(num, (value) -> (int)Math.pow(Integer.parseInt(value),2) );
    }
    /**
     * Stringを引数にとり、Integerを返す関数インターフェース
     */
    public static void printFunc(String[] params, Function<String, Integer> func) {
        for(String param : params) {
            System.out.println(String.format("%d", func.apply(param)));
        }
    }
}
  • 実行結果
10
20
30
1
4
9
ラムダ式の簡単化
  • 本体が一文である場合、{}を省略できる
  • 文の戻り値が暗黙的に戻り値とみなされる
  • 引数型は暗黙で類推されるので省略するのが一般的
  • 引数が1つの場合、くくるかっこも省略できる
  • 引数がない場合はかっこを省略できない
ラムダ式を伴うコレクションのメソッド
メソッド 内容
replaceAll 指定されたルールで置き換え
removeIf 合致した要素を削除
compute/comuteIfPresent/comupteIfAbsent マップに処理の結果を設定
merge 重複したキーの値を加工
  • replaceAll
var list = Arrays.asList("0,1,2", "3,4,5", "6,7,8")
list.replaceAll(v -> v.replace(',','-'));
System.out.println("replaceAll : " + list);
replaceAll : [0-1-2, 3-4-5, 6-7-8]
  • compute
var map = new HashMap<String, String>(Map.of(
    "1", "a", 
    "2", "b", 
    "3", "c")); 
map.compute("2", (k,v) -> k + v);
System.out.println(map);
{1=a, 2=2b, 3=c}

Stream API

  • コレクションなどのデータソースから繰り返し処理をStreamに引き渡す
  • 処理の流れは
  1. ストリーム生成
  2. 中間処理:抽出、加工
  3. 終端処理:出力、集計
 var list = Arrays.asList(0,1,2,3,4,5);
 list.stream()
       .filter(num -> num % 2 == 0)
       .map(num -> (int)Math.pow(num, 2))
       .forEach(System.out::println);
0
4
16

ファイル

ファイルを読む
ファイルに書く