「言語まとめ Java」の版間の差分
ナビゲーションに移動
検索に移動
(→演算) |
|||
| (同じ利用者による、間の27版が非表示) | |||
| 1行目: | 1行目: | ||
==[[言語まとめ Java]]== | ==[[言語まとめ Java]]== | ||
[[言語 まとめ]] | [[Java]]| | [[言語 まとめ]] | [[Java]]| | ||
| + | |||
| + | {{amazon|4798151122}} | ||
===準備=== | ===準備=== | ||
====参照サイト==== | ====参照サイト==== | ||
| 169行目: | 171行目: | ||
=====クラス===== | =====クラス===== | ||
*継承 | *継承 | ||
| + | ====ラムダ式==== | ||
| + | *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 | ||
| + | {|class="wikitable" | ||
| + | !名称!!内容 | ||
| + | |- | ||
| + | |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つの場合、くくるかっこも省略できる | ||
| + | *引数がない場合はかっこを省略できない | ||
| + | =====ラムダ式を伴うコレクションのメソッド===== | ||
| + | {|class="wikitable" | ||
| + | !メソッド!!内容 | ||
| + | |- | ||
| + | |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に引き渡す | ||
| + | *処理の流れは | ||
| + | #ストリーム生成 | ||
| + | #中間処理:抽出、加工 | ||
| + | #終端処理:出力、集計 | ||
| + | |||
| + | 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 | ||
====ファイル==== | ====ファイル==== | ||
=====ファイルを読む===== | =====ファイルを読む===== | ||
=====ファイルに書く===== | =====ファイルに書く===== | ||
2020年4月16日 (木) 16:25時点における最新版
言語まとめ Java
準備
参照サイト
- JDK6 ドキュメント http://java.sun.com/javase/ja/6/docs/ja/
- Java言語規定 第三版 http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
環境
言語基本
データ型
データ型
| 型 | 内容 |
|---|---|
| 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に引き渡す
- 処理の流れは
- ストリーム生成
- 中間処理:抽出、加工
- 終端処理:出力、集計
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
ファイル
ファイルを読む
ファイルに書く
© 2006 矢木浩人